Как использовать порты emscripten (SDL2 и Freetype) с cmake

Я пытаюсь скомпилировать проект C++, используя CMake для веб-сборки. Я использую 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».

Любая помощь будет принята с благодарностью.


person Astrejoe    schedule 04.05.2020    source источник
comment
Просто выполнение target_link_libraries(project SDL2 freetype) должно работать. В случае с Emscripten freetype и sdl2 будут всегда, так что нет необходимости в кросс-платформенных проверках.   -  person cajomar    schedule 22.08.2020


Ответы (1)


Я исправил проблему на основе этой страницы: https://github.com/emscripten-core/emscripten/issues/9259,

эта страница: Создание веб-сборки из проекта CMake с помощью указанный вывод HTML,

и эта страница: Emscripten - cmake - передать параметры emscripten в файле CMakeList

<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.

person Astrejoe    schedule 05.05.2020