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

Posted

技术标签:

【中文标题】如何将 Vulkan 添加到跨平台 CMake 项目?【英文标题】:How can I add Vulkan to a cross platform CMake project? 【发布时间】:2019-06-27 16:55:23 【问题描述】:

为了使 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】:

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

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

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

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

【讨论】:

感谢您的解释,但有些地方需要改进。嵌入 Vulkan-Hpp 的原因是开发环境只需要一个兼容 vulkan 的驱动程序(换句话说,用户不必安装 vulkan)。我可以通过添加 Vulkan-Headers 和 Vulkan-Loader 来管理吗? 在 Windows 和 Linux 上,Vulkan 加载程序应该作为驱动程序安装的一部分安装,或者作为驱动程序的依赖项由发行版安装。因此,如果您的用户拥有 Vulkan 驱动程序,他们应该拥有加载程序——您不需要构建或安装它。您只需要定义加载器接口的头文件,它位于 Vulkan-Headers 中。 "所以开发环境只需要一个兼容 vulkan 的驱动程序" 这不会发生。开发环境需要 Vulkan SDK。您的建议听起来类似于将 Vulkan SDK 重新创建为嵌入式 Git 存储库。

以上是关于如何将 Vulkan 添加到跨平台 CMake 项目?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CMake、conan 和 Vulkan SDK 的 Github 操作失败,因为找不到 conanfile.py

CLion CMake ld: library not found + Vulkan 和 OpenGL 问题

使用CMake自动将文件夹中的所有文件添加到目标?

如何将 Ivy 的依赖项添加到 Eclipse PDE 目标平台?

如何将 emscripten 与 cmake 一起用于项目依赖项?

如何使用 CMake 正确添加包含目录