如何将 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
综上所述,我在将 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 配置行。
为了使 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
综上所述,我在将 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
更一般地说,您正在使用 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 配置行。