如何将Vulkan添加到跨平台CMake项目?

时间:2019-06-27 16:55:23

标签: c++ cmake repository cross-platform vulkan

为了使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 个答案:

答案 0 :(得分:1)

如果您的find_package(Vulkan REQUIRED FATAL_ERROR)行失败,则需要确保正确安装了Vulkan SDK,即您具有指向正确位置的VULKAN_SDK环境变量。

此外,请勿嵌入KhronosGroup/Vulkan-Hpp存储库。该存储库用于构建Vulkan C ++绑定,但不应直接使用。相反,您应该使用与Vulkan SDK的安装捆绑在一起的vulkan.hpp标头。否则,当人们尝试构建您的项目并安装与嵌入式KhronosGroup/Vulkan-Hpp

所引用的版本不同的Vulkan SDK时,

通常,您使用find_package,然后再使用add_subdirectory尝试合并这些外部项目。那不是它的工作原理。 find_package将寻找该软件包的预先存在的二进制文件,而add_subdirectory并非旨在吞并整个现有的外部CMake项目。

如果您想让项目从源头构建其他项目,则应调查CMake的external project functionality的使用。但是,您可能会发现这比负担更重。或者,为目标平台安装vcpkg,并使用vcpkg构建和安装glfw和sfml,然后告诉CMake使用vcpkg依赖项(有关如何将CMAKE_TOOLCHAIN_FILE传递到cmake配置行的信息,请参阅vcpkg文档。