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

How can I add Vulkan to a cross platform CMake project?

为了使 CMake 项目尽可能简单和便携,我考虑将我需要的库的 "whole" 存储库添加到项目中。 项目结构如下:

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 以便在我的主项目中使用第三方库? 是不是项目结构不对?

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

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

引用的版本不同的 Vulkan SDK 时

更一般地说,您正在使用 find_package,然后您使用 add_subdirectory 来尝试合并这些外部项目。它不是这样工作的。 find_package 将查找包的 pre-existing 二进制文件,而 add_subdirectory 并非旨在仅吞并整个现有的外部 CMake 项目。

如果您想让您的项目从源代码构建这些其他项目,您应该研究 CMake external project functionality 的使用。但是,您可能会发现这是一种负担,而不是它的价值。或者,为您的目标平台安装 vcpkg,并使用 vcpkg 构建和安装 glfw 和 sfml,然后告诉 CMake 使用 vcpkg 依赖项(请参阅 vcpkg 文档了解如何将 CMAKE_TOOLCHAIN_FILE 传递给您的 cmake 配置行。