Emscripten构建时出现错误,错误与SDL3_ttf相关

编程语言 2026-07-09

我正在用这个引擎开发一个游戏引擎和一个游戏。

所以我想,是时候把它们拆分为一个静态库和一个可执行文件。

我为它分别再创建了两个独立的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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章