为了使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
总结所有内容,我在将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以便在主项目中使用第三方库? 项目结构不正确吗?
答案 0 :(得分:1)
如果您的find_package(Vulkan REQUIRED FATAL_ERROR)
行失败,则需要确保正确安装了Vulkan SDK,即您具有指向正确位置的VULKAN_SDK环境变量。
此外,请勿嵌入KhronosGroup/Vulkan-Hpp
存储库。该存储库用于构建Vulkan C ++绑定,但不应直接使用。相反,您应该使用与Vulkan SDK的安装捆绑在一起的vulkan.hpp标头。否则,当人们尝试构建您的项目并安装与嵌入式KhronosGroup/Vulkan-Hpp
通常,您使用find_package
,然后再使用add_subdirectory
尝试合并这些外部项目。那不是它的工作原理。 find_package
将寻找该软件包的预先存在的二进制文件,而add_subdirectory
并非旨在吞并整个现有的外部CMake项目。
如果您想让项目从源头构建其他项目,则应调查CMake的external project functionality的使用。但是,您可能会发现这比负担更重。或者,为目标平台安装vcpkg,并使用vcpkg构建和安装glfw和sfml,然后告诉CMake使用vcpkg依赖项(有关如何将CMAKE_TOOLCHAIN_FILE传递到cmake配置行的信息,请参阅vcpkg文档。