Emscripten构建时出现错误,错误与SDL3_ttf相关
我正在用这个引擎开发一个游戏引擎和一个游戏。
所以我想,是时候把它们拆分为一个静态库和一个可执行文件。
我为它分别再创建了两个独立的CMakeLists.txt,一个用于引擎,一个用于游戏。
这在我只有一个大CMake文件时还能工作。当我把它们分成三个文件(main、game、engine)时就开始出问题。
现在的问题是,emscripten似乎不太喜欢我在引擎中为SDL3_ttf所做的设置……
有人能帮我解决这个吗?
以下是我的CMake代码:
cmake_minimum_required(VERSION 3.26)
project(MiniginWorkspace)
# --- 1. Global Platform Setup ---
if (EMSCRIPTEN)
set(TARGET_NAME BurgerTime_web)
set(TARGET_PARAM "")
file(WRITE "${CMAKE_BINARY_DIR}/dummy_freetype.a" "")
set(Freetype_FOUND TRUE CACHE BOOL "" FORCE)
set(FREETYPE_FOUND TRUE CACHE BOOL "" FORCE)
set(FREETYPE_INCLUDE_DIRS "EMSCRIPTEN_INTERNAL" CACHE PATH "" FORCE)
set(FREETYPE_LIBRARY "${CMAKE_BINARY_DIR}/dummy_freetype.a" CACHE FILEPATH "" FORCE)
set(FREETYPE_LIBRARIES "${CMAKE_BINARY_DIR}/dummy_freetype.a" CACHE FILEPATH "" FORCE)
file(WRITE "${CMAKE_BINARY_DIR}/dummy_harfbuzz.a" "")
set(HarfBuzz_FOUND TRUE CACHE BOOL "" FORCE)
set(HarfBuzz_INCLUDE_DIRS "EMSCRIPTEN_INTERNAL" CACHE PATH "" FORCE)
set(HarfBuzz_LIBRARIES "${CMAKE_BINARY_DIR}/dummy_harfbuzz.a" CACHE FILEPATH "" FORCE)
add_compile_options("-sUSE_FREETYPE=1" "-sUSE_HARFBUZZ=1")
add_link_options("-sUSE_FREETYPE=1" "-sUSE_HARFBUZZ=1")
else ()
set(TARGET_NAME BurgerTime)
set(TARGET_PARAM WIN32)
endif ()
# --- 2. Dependencies (FetchContent) ---
include(FetchContent)
# GLM
find_package(glm CONFIG QUIET)
if (NOT glm_FOUND)
FetchContent_Declare(glm URL https://github.com/g-truc/glm/releases/download/1.0.3/glm-1.0.3.zip)
FetchContent_MakeAvailable(glm)
endif ()
# SDL3
find_package(SDL3 3.4 CONFIG QUIET)
if (NOT SDL3_FOUND)
if (WIN32)
FetchContent_Declare(SDL3 URL https://www.libsdl.org/release/SDL3-devel-3.4.0-VC.zip)
FetchContent_MakeAvailable(SDL3)
list(PREPEND CMAKE_PREFIX_PATH "${sdl3_SOURCE_DIR}")
find_package(SDL3 CONFIG REQUIRED)
else ()
FetchContent_Declare(SDL3 GIT_REPOSITORY https://github.com/libsdl-org/SDL.git GIT_TAG release-3.4.0)
FetchContent_MakeAvailable(SDL3)
endif ()
endif ()
# Add SDL3_ttf
find_package(SDL3_ttf 3.2.2 CONFIG QUIET)
if (NOT SDL3_ttf_FOUND)
if (WIN32)
FetchContent_Declare(SDL3_ttf URL https://www.libsdl.org/projects/SDL_ttf/release/SDL3_ttf-devel-3.2.2-VC.zip)
FetchContent_MakeAvailable(SDL3_ttf)
list(PREPEND CMAKE_PREFIX_PATH "${sdl3_ttf_SOURCE_DIR}")
find_package(SDL3_ttf CONFIG REQUIRED)
else ()
FetchContent_Declare(SDL3_ttf GIT_REPOSITORY https://github.com/libsdl-org/SDL_ttf.git GIT_TAG release-3.2.2)
if (EMSCRIPTEN)
set(SDL3TTF_VENDORED OFF CACHE BOOL "" FORCE)
set(SDL3TTF_SYSTEM_FREETYPE ON CACHE BOOL "" FORCE)
set(SDL3TTF_HARFBUZZ ON CACHE BOOL "" FORCE)
set(SDL3TTF_INSTALL OFF CACHE BOOL "" FORCE)
set(Freetype_DIR "${CMAKE_BINARY_DIR}" CACHE PATH "" FORCE)
endif ()
FetchContent_MakeAvailable(SDL3_ttf)
endif ()
endif ()
# ImGui & ImPlot
FetchContent_Declare(imgui GIT_REPOSITORY https://github.com/ocornut/imgui GIT_TAG v1.92.5-docking)
FetchContent_Declare(implot GIT_REPOSITORY https://github.com/epezent/implot.git GIT_TAG v0.17)
FetchContent_MakeAvailable(imgui implot)
# --- 3. Optional Features (VLD/Steam) ---
if (WIN32)
find_package(VLD CONFIG)
endif ()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/steam")
find_package(Steamworks QUIET)
# --- 4. Add Subdirectories ---
add_subdirectory(Minigin)
add_subdirectory(Game)
以下是我从GitHub Action获得的错误:
-- GLM: Version 1.0.3
-- GLM: Disable -Wc++98-compat warnings
-- GLM: Build with C++ features auto detection
-- Found PkgConfig: /usr/bin/pkg-config (found version "1.8.1")
-- Detecting Target CPU Architecture
-- Detecting Target CPU Architecture - EMSCRIPTEN
-- Performing Test COMPILER_SUPPORTS_FCOLOR_DIAGNOSTICS
-- Performing Test COMPILER_SUPPORTS_FCOLOR_DIAGNOSTICS - Success
-- Looking for getresgid
-- Looking for getresgid - found
-- Looking for getresuid
-- Looking for getresuid - found
-- Checking for modules 'libunwind;libunwind-generic'
-- Package 'libunwind', required by 'virtual:world', not found
-- Package 'libunwind-generic', required by 'virtual:world', not found
-- Performing Test HAVE_POSIX_SPAWN
-- Performing Test HAVE_POSIX_SPAWN - Failed
-- Looking for vfork
-- Looking for vfork - found
--
-- SDL3 was configured with the following options:
--
-- Platform: Emscripten-1
-- 64-bit: FALSE
-- Compiler: /home/runner/work/_temp/21a43070-12d7-4f27-af94-251902edc8f1/emsdk-main/upstream/emscripten/emcc
-- Revision: SDL-3.4.0-release-3.4.0
-- Vendor:
--
-- Subsystems:
-- Audio: ON
-- Video: ON
-- GPU: ON
-- Render: ON
-- Camera: ON
-- Joystick: ON
-- Haptic: ON
-- Hidapi: ON
-- Power: ON
-- Sensor: ON
-- Dialog: ON
-- Tray: ON
--
-- Options:
-- SDL_ALSA (Wanted: ON): OFF
-- SDL_ALSA_SHARED (Wanted: OFF): OFF
-- SDL_ALTIVEC (Wanted: OFF): OFF
-- SDL_ARMNEON (Wanted: OFF): OFF
-- SDL_ASAN (Wanted: OFF): OFF
-- SDL_ASSEMBLY (Wanted: OFF): OFF
-- SDL_ASSERTIONS (Wanted: auto): auto
-- SDL_AVX (Wanted: OFF): OFF
-- SDL_AVX2 (Wanted: OFF): OFF
-- SDL_AVX512F (Wanted: OFF): OFF
-- SDL_BACKGROUNDING_SIGNAL (Wanted: OFF): OFF
-- SDL_CCACHE (Wanted: OFF): OFF
-- SDL_CLANG_TIDY (Wanted: OFF): OFF
-- SDL_CLOCK_GETTIME (Wanted: ON): ON
-- SDL_COCOA (Wanted: OFF): OFF
-- SDL_DBUS (Wanted: ON): OFF
-- SDL_DEPS_SHARED (Wanted: OFF): OFF
-- SDL_DIRECTX (Wanted: OFF): OFF
-- SDL_DISKAUDIO (Wanted: ON): ON
-- SDL_DLOPEN_NOTES (Wanted: ON): OFF
-- SDL_DUMMYAUDIO (Wanted: ON): ON
-- SDL_DUMMYCAMERA (Wanted: ON): ON
-- SDL_DUMMYVIDEO (Wanted: ON): ON
-- SDL_EXAMPLES (Wanted: OFF): OFF
-- SDL_EXAMPLES_LINK_SHARED (Wanted: OFF): OFF
-- SDL_FOREGROUNDING_SIGNAL (Wanted: OFF): OFF
-- SDL_FRIBIDI (Wanted: ON): OFF
-- SDL_FRIBIDI_SHARED (Wanted: OFF): OFF
-- SDL_GCC_ATOMICS (Wanted: ON): ON
-- SDL_HIDAPI (Wanted: ON): OFF
-- SDL_HIDAPI_JOYSTICK (Wanted: ON): OFF
-- SDL_HIDAPI_LIBUSB (Wanted: ON): OFF
-- SDL_HIDAPI_LIBUSB_SHARED (Wanted: OFF): OFF
-- SDL_IBUS (Wanted: ON): OFF
-- SDL_INSTALL (Wanted: OFF): OFF
-- SDL_INSTALL_TESTS (Wanted: OFF): OFF
-- SDL_JACK (Wanted: ON): OFF
-- SDL_JACK_SHARED (Wanted: OFF): OFF
-- SDL_KMSDRM (Wanted: ON): OFF
-- SDL_KMSDRM_SHARED (Wanted: OFF): OFF
-- SDL_LASX (Wanted: OFF): OFF
-- SDL_LIBC (Wanted: ON): ON
-- SDL_LIBICONV (Wanted: OFF): OFF
-- SDL_LIBTHAI (Wanted: ON): OFF
-- SDL_LIBTHAI_SHARED (Wanted: OFF): OFF
-- SDL_LIBUDEV (Wanted: ON): OFF
-- SDL_LIBURING (Wanted: ON): OFF
-- SDL_LSX (Wanted: OFF): OFF
-- SDL_METAL (Wanted: OFF): OFF
-- SDL_MMX (Wanted: OFF): OFF
-- SDL_OFFSCREEN (Wanted: ON): ON
-- SDL_OPENGL (Wanted: ON): OFF
-- SDL_OPENGLES (Wanted: ON): ON
-- SDL_OPENVR (Wanted: OFF): OFF
-- SDL_OSS (Wanted: ON): OFF
-- SDL_PIPEWIRE (Wanted: ON): OFF
-- SDL_PIPEWIRE_SHARED (Wanted: OFF): OFF
-- SDL_PTHREADS (Wanted: OFF): OFF
-- SDL_PTHREADS_SEM (Wanted: OFF): OFF
-- SDL_PULSEAUDIO (Wanted: ON): OFF
-- SDL_PULSEAUDIO_SHARED (Wanted: OFF): OFF
-- SDL_RENDER_D3D (Wanted: OFF): OFF
-- SDL_RENDER_D3D11 (Wanted: OFF): OFF
-- SDL_RENDER_D3D12 (Wanted: OFF): OFF
-- SDL_RENDER_GPU (Wanted: ON): OFF
-- SDL_RENDER_METAL (Wanted: OFF): OFF
-- SDL_RENDER_VULKAN (Wanted: OFF): OFF
-- SDL_ROCKCHIP (Wanted: OFF): OFF
-- SDL_RPATH (Wanted: ON): OFF
-- SDL_RPI (Wanted: OFF): OFF
-- SDL_SNDIO (Wanted: ON): OFF
-- SDL_SNDIO_SHARED (Wanted: OFF): OFF
-- SDL_SSE (Wanted: OFF): OFF
-- SDL_SSE2 (Wanted: OFF): OFF
-- SDL_SSE3 (Wanted: OFF): OFF
-- SDL_SSE4_1 (Wanted: OFF): OFF
-- SDL_SSE4_2 (Wanted: OFF): OFF
-- SDL_SYSTEM_ICONV (Wanted: ON): ON
-- SDL_TESTS (Wanted: OFF): OFF
-- SDL_TESTS_LINK_SHARED (Wanted: OFF): OFF
-- SDL_UNINSTALL (Wanted: OFF): OFF
-- SDL_VIRTUAL_JOYSTICK (Wanted: ON): ON
-- SDL_VIVANTE (Wanted: OFF): OFF
-- SDL_VULKAN (Wanted: OFF): OFF
-- SDL_WASAPI (Wanted: OFF): OFF
-- SDL_WAYLAND (Wanted: ON): OFF
-- SDL_WAYLAND_LIBDECOR (Wanted: ON): OFF
-- SDL_WAYLAND_LIBDECOR_SHARED (Wanted: OFF): OFF
-- SDL_WAYLAND_SHARED (Wanted: OFF): OFF
-- SDL_X11 (Wanted: ON): OFF
-- SDL_X11_SHARED (Wanted: OFF): OFF
-- SDL_X11_XCURSOR (Wanted: ON): OFF
-- SDL_X11_XDBE (Wanted: ON): OFF
-- SDL_X11_XFIXES (Wanted: ON): OFF
-- SDL_X11_XINPUT (Wanted: ON): OFF
-- SDL_X11_XRANDR (Wanted: ON): OFF
-- SDL_X11_XSCRNSAVER (Wanted: ON): OFF
-- SDL_X11_XSHAPE (Wanted: ON): OFF
-- SDL_X11_XSYNC (Wanted: ON): OFF
-- SDL_X11_XTEST (Wanted: ON): OFF
-- SDL_XINPUT (Wanted: OFF): OFF
--
-- Build Shared Library: OFF
-- Build Static Library: ON
--
-- Enabled backends:
-- Video drivers: dummy emscripten offscreen
-- Render drivers: ogl_es2
-- GPU drivers:
-- Audio drivers: disk dummy emscripten
-- Joystick drivers: emscripten virtual
-- Camera drivers: dummy emscripten
--
-- If something was not detected, although the libraries
-- were installed, then make sure you have set the
-- CMAKE_C_FLAGS and CMAKE_PREFIX_PATH CMake variables correctly.
--
-- Configuring SDL3_ttf 3.2.2
-- Performing Test LINKER_SUPPORTS_VERSION_SCRIPT
-- Performing Test LINKER_SUPPORTS_VERSION_SCRIPT - Failed
-- Could NOT find harfbuzz: Found unsuitable version "harfbuzz_VERSION-NOTFOUND", but required is at least "2.3.1" (found harfbuzz_LIBRARY-NOTFOUND)
-- harfbuzz NOT found
-- SDL3_ttf: Using system freetype library
-- Found Freetype: /home/runner/work/Prog4_GeertsWarre/Prog4_GeertsWarre/build-web/dummy_freetype.a
-- Could NOT find plutovg (missing: plutovg_LIBRARY plutovg_INCLUDE_PATH)
-- Could NOT find plutosvg (missing: plutosvg_LIBRARY plutosvg_INCLUDE_PATH plutovg_FOUND)
-- plutosvg NOT found
-- SDL3_ttf backends:
-- - enabled: freetype
-- - disabled: harfbuzz plutosvg
-- Configuring done (7.5s)
CMake Error in build-web/_deps/sdl3_ttf-src/CMakeLists.txt:
Imported target "Freetype::Freetype" includes non-existent path
"EMSCRIPTEN_INTERNAL"
in its INTERFACE_INCLUDE_DIRECTORIES. Possible reasons include:
* The path was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and references files it does not
provide.
CMake Warning:
-- Generating done (0.1s)
Manually-specified variables were not used by the project:
SDL_TEST
CMake Generate step failed. Build files cannot be regenerated correctly.
Error: Process completed with exit code 1.
解决方案
当你把项目拆分为一个可执行文件和一个库时,CMake会变得更加严格。原因是你在第一段代码的开头就伪造路径以满足提示,但该文件很可能无效或不能工作,因此会抛出错误。
最简单的修复方法是使用FreeType和 Harfbuzz的内置系统端口。
尝试把主代码中的if (EMSCRIPTEN) 区块更新为以下内容:
if (EMSCRIPTEN)
set(TARGET_NAME BurgerTime_web)
add_compile_options("-sUSE_FREETYPE=1" "-sUSE_HARFBUZZ=1")
add_link_options("-sUSE_FREETYPE=1" "-sUSE_HARFBUZZ=1")
set(SDL3TTF_VENDORED OFF CACHE BOOL "" FORCE)
set(SDL3TTF_FREETYPE ON CACHE BOOL "" FORCE)
set(SDL3TTF_HARFBUZZ ON CACHE BOOL "" FORCE)
if(NOT TARGET Freetype::Freetype)
add_library(Freetype::Freetype INTERFACE IMPORTED)
endif()
if(NOT TARGET harfbuzz::harfbuzz)
add_library(harfbuzz::harfbuzz INTERFACE IMPORTED)
endif()
else ()
set(TARGET_NAME BurgerTime)
set(TARGET_PARAM WIN32)
endif ()
既然依赖项已内置,你需要更新SDL3_ttf的获取逻辑。尝试替换为以下内容:
if (EMSCRIPTEN)
set(SDL3TTF_VENDORED OFF CACHE BOOL "" FORCE)
set(SDL3TTF_SYSTEM_FREETYPE ON CACHE BOOL "" FORCE)
set(SDL3TTF_HARFBUZZ ON CACHE BOOL "" FORCE)
set(SDL3TTF_INSTALL OFF CACHE BOOL "" FORCE)
endif ()
这应该能解决问题。只是请确保在你的 Minigin/CMakeLists.txt 中,使用 target_link_libraries(Minigin PUBLIC SDL3::SDL3 SDL3_ttf::SDL3_ttf)。
希望这对你有帮助!
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。