【问题标题】:How to use emscripten ports (SDL2 and Freetype) with cmake如何在 cmake 中使用 emscripten 端口(SDL2 和 Freetype)
【发布时间】:2020-08-18 18:40:55
【问题描述】:

我正在尝试使用 CMake 将 C++ 项目编译为 webassembly。我正在使用 emscripten,我想将 emscripten 端口用于 SDL2 和 Freetype。通常,使用 emcc 编译时,您将使用标志:-USE_SDL=2 和 -USE_FREETYPE=1,以包含这些端口。但是我不知道如何使用 CMake 来实现这一点。

这是我的 CMakeList 文件:


cmake_minimum_required(VERSION 3.15)
project(project)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")

find_package(SDL2 REQUIRED)
find_package(Freetype REQUIRED)
include_directories(${CMAKE_SOURCE_DIR}/include ${SDL2_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS})

add_executable(project src/main.cpp src/glad.c src/Game.cpp src/Block.cpp include/jumpyblock/Block.h)
target_link_libraries(project ${SDL2_LIBRARIES} ${FREETYPE_LIBRARIES})

使用常规 cmake 编译并成功运行。

到目前为止,我已经尝试使用emcmake cmake . && make 进行编译,它给了我一个错误,说它找不到 SDL2 的包配置文件。

我已经尝试修改 CMakeList 文件以使用端口的 emcc 标志:


cmake_minimum_required(VERSION 3.15)
project(project)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -USE_SDL=2 -USE_FREETYPE=1")

include_directories(${CMAKE_SOURCE_DIR}/include ${SDL2_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS})

add_executable(project src/main.cpp src/glad.c src/Game.cpp src/Block.cpp include/jumpyblock/Block.h )
target_link_libraries(project ${SDL2_LIBRARIES} ${FREETYPE_LIBRARIES})

有了这个 cmake 文件,emcmake cmake . 运行成功,但随后make 抱怨它找不到'SDL2/SDL.h'。

任何帮助将不胜感激。

【问题讨论】:

  • 只做target_link_libraries(project SDL2 freetype) 应该可以。在 Emscripten freetype 和 sdl2 的情况下,将始终在那里,因此不需要跨平台检查。

标签: c++ cmake port sdl emscripten


【解决方案1】:

我根据此页面修复了问题:https://github.com/emscripten-core/emscripten/issues/9259

本页:Generate Web Assembly from CMake Project with a Specified HTML Output

这个页面:Emscripten - cmake - pass emscripten options in CMakeList file

<pre><code>
cmake_minimum_required(VERSION 3.15)
project(project)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")

if( ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten")
    set(USE_FLAGS "-s USE_SDL=2 -s USE_FREETYPE=1")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${USE_FLAGS}")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${USE_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${USE_FLAGS}")
    set(CMAKE_EXECUTABLE_SUFFIX .html)
else()
    find_package(SDL2 REQUIRED)
    find_package(Freetype REQUIRED)
endif()
include_directories(${CMAKE_SOURCE_DIR}/include ${SDL2_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS})

add_executable(project src/main.cpp src/glad.c src/Game.cpp src/Block.cpp include/jumpyblock/Block.h)
target_link_libraries(project ${SDL2_LIBRARIES} ${FREETYPE_LIBRARIES})
</code></pre>

这使用 emscripten 编译,使用 emcmake cmake . &amp;&amp; make 并定期使用 cmake . &amp;&amp; make

【讨论】:

    【解决方案2】:

    我用这个欺骗emcc 安装 zlib 端口:

    emcc -s USE_ZLIB=1 $(mktemp)
    

    emcmake cmake .. 开始为我工作。我敢打赌,您应该能够对 SDL 做同样的事情。

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多