Как я могу добавить Vulkan в кроссплатформенный проект CMake? - PullRequest
1 голос
/ 27 июня 2019

Чтобы сделать проект CMake настолько простым и настолько портативным, насколько это возможно, я решил добавить в проект «целые» репозитории библиотек, которые мне нужны. Структура проекта выглядит следующим образом:

MyProject/
└──CMakeLists.txt
└──src/
    └──MyProject/
        └── *.h & *.cpp
        └── CMakeLists.txt
└──ThirdParty/
    └──Vulkan-Hpp/
        └──(Vulkan Files)
    └──glfw/
        └──(glfw Files)
    └──SFML/
        └──(SFML Files)

Все сторонние каталоги являются подмодулями git следующих репозиториев: https://github.com/KhronosGroup/Vulkan-Hpp

https://github.com/SFML/SFML

https://github.com/glfw/glfw

Подводя итог, я испытываю трудности при интеграции библиотек vulkan и sfml в проект.

MyProject / CMakeLists.txt выглядит следующим образом:

cmake_minimum_required (VERSION 3.8 FATAL_ERROR)

project ("MyProject")

set (MyProject_VERSION_MAJOR 0)
set (MyProject_VERSION_MINOR 2)
set (MyProject_VERSION_PATCH 1)

set (CMAKE_CXX_STANDARD 17)

# Include sub-projects.
add_subdirectory ("src/MyProject")
add_subdirectory ("ThirdParty/glfw")
add_subdirectory ("ThirdParty/SFML")
add_subdirectory ("ThirdParty/Vulkan-Hpp")

MyProject / SRC / MyProject / CMakeLists.txt:

cmake_minimum_required (VERSION 3.8 FATAL_ERROR)

project ("MyProject")
find_package(Vulkan REQUIRED FATAL_ERROR) # error
find_package(SFML REQUIRED network audio) # error
find_package(glfw REQUIRED FATAL_ERROR) # error

# Add source to this project's executable.
add_executable (MyProject "MyProject.cpp")

target_include_directories (MyProject 
    PUBLIC ${GLFW_INCLUDE_DIRS}
    PUBLIC ${SFML_INCLUDE_DIR}
    PUBLIC ${VULKAN_INCLUDE_DIRS}
)

target_link_libraries (MyProject glfw)
target_link_libraries (MyProject ${VULKAN_LIB_LIST})
target_link_libraries (MyProject ${SFML_LIBRARIES})

Как настроить CMake для использования сторонних библиотек в моем основном проекте? Неверная структура проекта?

1 Ответ

1 голос
/ 27 июня 2019

Если ваша линия find_package(Vulkan REQUIRED FATAL_ERROR) не работает, вам необходимо убедиться, что Vulkan SDK установлен правильно, т. Е. У вас есть переменная среды VULKAN_SDK, которая указывает на правильное местоположение.

Кроме того, не вставляйте репозиторий KhronosGroup/Vulkan-Hpp. Этот репозиторий предназначен для создания привязок Vulkan C ++, но не должен использоваться напрямую. Вместо этого вы должны использовать заголовок vulkan.hpp, который поставляется вместе с вашей установкой Vulkan SDK. В противном случае, когда люди пытаются построить ваш проект и установить версию Vulkan SDK, отличную от указанной во встроенном KhronosGroup/Vulkan-Hpp

В более общем случае вы используете find_package, а затем вы используете add_subdirectory, чтобы попытаться включить эти внешние проекты. Это не так, как это работает. find_package будет искать уже существующий двоичный файл пакета, тогда как add_subdirectory не предназначен для того, чтобы просто проглотить все существующие внешние проекты CMake.

Если вы хотите, чтобы ваш проект строил эти другие из исходных текстов, вам следует изучить использование внешней функции проекта CMake . Тем не менее, вы, вероятно, сочтете это большим бременем, чем оно того стоит. В качестве альтернативы, установите vcpkg для вашей целевой платформы и используйте vcpkg для сборки и установки glfw и sfml, затем скажите CMake, чтобы использовать зависимости vcpkg (см. Документацию vcpkg о том, как передать CMAKE_TOOLCHAIN_FILE в строку конфигурации cmake.

...