Как создать Cmakelists для кроссплатформенного приложения Raylib?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как создать Cmakelists для кроссплатформенного приложения Raylib?

Сообщение Anonymous »

Я хочу использовать Cmake для моей видеоигры Raylib, чтобы любой пользователь мог легко создать приложение на своей платформе. Идея состоит в том, чтобы попытаться найти библиотеку Raylib в системе, прежде чем попытаться установить ее через FetchContent, так как Raylib занимает много места (около 400 МБ). < /P>
Так что вот рабочий процесс: < /p>

[*] Проверьте, используется ли менеджер пакета vcpkg, что на PC и настроен Cmake_TOLH find_package () может правильно найти пакет в установленных библиотеках VCPKG. This has to be done before declaring project()
[*]call find_package()
[*]check additional directories for linux if find_package() did not find raylib
[*]if raylib is still not found - fetch release from github using functions Fetchcontent_declare (raylib) , fetchcontent_getproperties (raylib) , fetchcontent_makeaavailable (raylib) , которые поддерживаются на cmake 3.11+
Если используется Linux, проверьте, если требуется зависимости
, если Linux используется, проверьте, если требуется зависимости
. Библиотеки < /li>
< /ol>
Многие шаблоны Cmake на GitHub Используйте содержимое избранного для Raylib, но я хочу сначала проверить, если пакет уже существует в системе. В моем случае find_package () не нашел raylib на Linux, пока я не проверил USR/Local/incost и usr/local/lib с подсказками. VCPKG в Windows работал правильно. < /P>
Это структура папки: < /p>

Код: Выделить всё

|   CMakeLists.txt
|
+---assets
|   +---Font
|   |
|   +---Graphics
|   |
|   \---Sounds
|
+---build
\---src (all cpp and h files)
< /code>
Это Cmakelists: < /p>
cmake_minimum_required(VERSION 3.11)  # For FetchContent - version 3.11+ required

# vcpkg
if(DEFINED ENV{VCPKG_ROOT})
message(STATUS "VCPKG found")
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake")
if(DEFINED ENV{VCPKG_DEFAULT_TRIPLET})
set(VCPKG_TARGET_TRIPLET "$ENV{VCPKG_DEFAULT_TRIPLET}")
else()
set(VCPKG_TARGET_TRIPLET "x64-windows")
endif()
endif()

project(MyRaylibProject)
find_package(raylib QUIET) # QUIET or REQUIRED

# if raylib is not found via find_package() and host is UNIX - check other directories
if(NOT raylib_FOUND AND UNIX)
message("Checking additional directories")
find_path(raylib_INCLUDE_DIRS raylib.h
HINTS /usr/local/include /usr/include
)

find_library(raylib_LIBRARIES
NAMES raylib libraylib
HINTS /usr/local/lib /usr/lib
)

if(raylib_INCLUDE_DIRS AND raylib_LIBRARIES)
set(raylib_FOUND TRUE)
message(STATUS "Raylib found")
endif()
endif()

# if raylib is not found, fetch from github
set(RAYLIB_VERSION 5.5)
if (NOT raylib_FOUND) # If there's none, fetch and build raylib
include(FetchContent)
FetchContent_Declare(
raylib
DOWNLOAD_EXTRACT_TIMESTAMP OFF
URL https://github.com/raysan5/raylib/archive/refs/tags/${RAYLIB_VERSION}.tar.gz
)
FetchContent_GetProperties(raylib)
if (NOT raylib_POPULATED) # Have we downloaded raylib yet?
set(FETCHCONTENT_QUIET NO)
FetchContent_MakeAvailable(raylib)
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) # don't build the supplied examples
set(BUILD_GAMES OFF CACHE BOOL "" FORCE) # don't build the supplied example games
endif()
endif()

set(FETCHCONTENT_UPDATES_DISCONNECTED ON)

if(UNIX AND NOT APPLE)  # dependencie check linux
find_package(X11 REQUIRED)
find_package(ALSA REQUIRED)

if(NOT X11_FOUND OR NOT ALSA_FOUND)
message(FATAL_ERROR "Missing Linux dependencies.  Install with:\n"
"  sudo apt install libasound2-dev libx11-dev libxrandr-dev libxi-dev\n"
"  libgl1-mesa-dev libglu1-mesa-dev libxcursor-dev libxinerama-dev\n"
"  libwayland-dev libxkbcommon-dev")
endif()

endif()

file(GLOB PROJECT_SOURCES "src/*.cpp")
file(GLOB PROJECT_INCLUDE "src/*.h")

add_executable(${PROJECT_NAME})
target_sources(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCES})
target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_INCLUDE})
target_link_libraries(${PROJECT_NAME} PRIVATE raylib)
file(COPY assets DESTINATION ${CMAKE_BINARY_DIR})

if (APPLE)
target_link_libraries(${PROJECT_NAME} "-framework IOKit")
target_link_libraries(${PROJECT_NAME} "-framework Cocoa")
target_link_libraries(${PROJECT_NAME} "-framework OpenGL")
endif()
Вопрос: это правильный способ проверить, уже установлена ​​ли библиотека Raylib на данной ОС, прежде чем его загрузить, если нет, то какие изменения я должен внести? На linux find_package () не обнаружил, что raylib установлен в соответствии с руководством Github по установке Raylib, но проверяя дополнительные каталоги, так же как и содержимое.

Подробнее здесь: https://stackoverflow.com/questions/795 ... pplication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»