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

9
为了使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 库集成到项目中时遇到了问题。
我的项目/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以便在主要项目中使用第三方库?项目结构是否不正确?


请注意,FATAL_ERROR不是find_package的有效参数。我猜你也想在SFML搜索中在network audio之前传递COMPONENTS参数。 - mathstuf
1个回答

8
如果您的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的外部项目功能的使用。但是,您可能会发现这更加麻烦而不值得。或者,为您的目标平台安装vcpkg,并使用vcpkg构建和安装glfw和sfml,然后告诉CMake使用vcpkg依赖项(请参阅vcpkg文档,了解如何将CMAKE_TOOLCHAIN_FILE传递给cmake配置行)。

1
谢谢您的解释,但有些事情需要改进。嵌入Vulkan-Hpp的原因是开发环境只需要一个兼容Vulkan的驱动程序(换句话说,用户不必安装Vulkan)。我能通过添加Vulkan-Headers和Vulkan-Loader来实现这一点吗? - Roberto P. Romero
在Windows和Linux上,Vulkan加载器应该作为驱动程序安装的一部分或由发行版作为驱动程序的依赖项安装。因此,如果您的用户有Vulkan驱动程序,则应该有加载器 - 您不需要构建或安装它。您只需要定义与加载器接口的头文件,这在Vulkan-Headers中。 - Jesse Hall
这是不可能的。开发环境需要Vulkan SDK。你所建议的听起来类似于将Vulkan SDK重新创建为嵌入式Git存储库。 - Jherico
请注意,FATAL_ERROR不是find_package的有效参数,请勿使用。更多信息请参见:https://gitlab.kitware.com/cmake/cmake/-/issues/23849 - Niko Kauppi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接