如何将 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 问题
如何将 Ivy 的依赖项添加到 Eclipse PDE 目标平台?