如何在 cmake 中使用 emscripten 端口(SDL2 和 Freetype)
Posted
技术标签:
【中文标题】如何在 cmake 中使用 emscripten 端口(SDL2 和 Freetype)【英文标题】:How to use emscripten ports (SDL2 and Freetype) with cmake 【发布时间】: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 的情况下,将始终在那里,因此不需要跨平台检查。
【参考方案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 . && make
并定期使用 cmake . && make
。
【讨论】:
【参考方案2】:我用这个欺骗emcc
安装 zlib 端口:
emcc -s USE_ZLIB=1 $(mktemp)
和emcmake cmake ..
开始为我工作。我敢打赌,您应该能够对 SDL 做同样的事情。
【讨论】:
以上是关于如何在 cmake 中使用 emscripten 端口(SDL2 和 Freetype)的主要内容,如果未能解决你的问题,请参考以下文章
如何将 emscripten 与 cmake 一起用于项目依赖项?
如何让 JetBrains CLion 中的“cmake”工作来编译 Emscripten/WebAssembly?