如何仅通过CMake自动下载并配置Vulkan SDK至项目?
用CMake自动下载并构建完整Vulkan依赖的解决方案
我正尝试在CMake项目中链接Vulkan,希望仅依靠CMake自动下载Vulkan SDK,不依赖其他工具。我尝试使用FetchContent,但仅下载了Vulkan SDK的头文件;用ExternalProject也只获取了头文件。还未处理dxcompilerd、glslangd、shaderc_combinedd、spirv-cross-cored等组件的下载,请问如何实现无需手动下载,就能让Vulkan SDK适配我的项目?
之前的尝试代码
FetchContent尝试的代码
include(FetchContent) set(VULKAN_VER_MAJOR 1) set(VULKAN_VER_MINOR 3) set(VULKAN_VER_PATCH 275) set(VULKAN_VERSION ${VULKAN_VER_MAJOR}.${VULKAN_VER_MINOR}.${VULKAN_VER_PATCH}) FetchContent_Declare( vulkanheaders GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Headers.git GIT_TAG v${VULKAN_VERSION} GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) FetchContent_Declare( vulkanloader GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Loader.git GIT_TAG v${VULKAN_VERSION} GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) FetchContent_Declare( vulkanvalidation GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-ValidationLayers.git GIT_TAG v${VULKAN_VERSION} GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) FetchContent_Declare( vulkantools GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Tools.git GIT_TAG v${VULKAN_VERSION} GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) set(PROJECT_IS_TOP_LEVEL OFF) FetchContent_MakeAvailable(vulkanheaders) FetchContent_MakeAvailable(vulkanloader) FetchContent_MakeAvailable(vulkanvalidation) FetchContent_MakeAvailable(vulkantools) add_library(myvulkan INTERFACE IMPORTED) target_include_directories(myvulkan INTERFACE ${vulkan_headers_SOURCE_DIR}/include ${vulkan_loader_SOURCE_DIR}/loader ${vulkan_validation_layers_SOURCE_DIR}/layers ${vulkan_tools_SOURCE_DIR}/vulkaninfo) target_link_libraries(myvulkan INTERFACE Vulkan::Vulkan) target_link_libraries(myvulkan INTERFACE Vulkan::Loader Vulkan::ValidationLayers ) # Add source to this project's executable. add_executable (VulkanTest "VulkanTest.cpp" "VulkanTest.h") target_link_libraries(VulkanTest PRIVATE myvulkan) if (CMAKE_VERSION VERSION_GREATER 3.12) set_property(TARGET VulkanTest PROPERTY CXX_STANDARD 20) endif()
ExternalProject尝试的代码
include(FetchContent) include(ExternalProject) set(VULKAN_VER_MAJOR 1) set(VULKAN_VER_MINOR 3) set(VULKAN_VER_PATCH 275) set(VULKAN_VERSION ${VULKAN_VER_MAJOR}.${VULKAN_VER_MINOR}.${VULKAN_VER_PATCH}) ExternalProject_Add( vulkan PREFIX Vulkan GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Headers.git GIT_TAG v${VULKAN_VERSION} CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" LOG_DOWNLOAD ON ) ExternalProject_Get_Property(vulkan SOURCE_DIR) include_directories(${SOURCE_DIR}/include) add_library(Vulkan INTERFACE) add_dependencies(Vulkan vulkan) # Add source to this project's executable. add_executable (VulkanTest "VulkanTest.cpp" "VulkanTest.h") target_link_libraries(VulkanTest Vulkan) if (CMAKE_VERSION VERSION_GREATER 3.12) set_property(TARGET VulkanTest PROPERTY CXX_STANDARD 20) endif()
完整解决方案
核心问题说明
你之前的代码只完成了源码下载,没有触发依赖库的构建流程。Vulkan-Loader、ValidationLayers等都是编译型库,并非仅头文件;而glslang、shaderc等工具链组件也需要单独配置并构建。
可直接使用的CMake脚本
cmake_minimum_required(VERSION 3.21) project(VulkanTest) # 设置Vulkan版本 set(VULKAN_VER_MAJOR 1) set(VULKAN_VER_MINOR 3) set(VULKAN_VER_PATCH 275) set(VULKAN_VERSION ${VULKAN_VER_MAJOR}.${VULKAN_VER_MINOR}.${VULKAN_VER_PATCH}) include(FetchContent) FetchContent_Declare( vulkanheaders GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Headers.git GIT_TAG v${VULKAN_VERSION} GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) # 构建Vulkan-Loader FetchContent_Declare( vulkanloader GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Loader.git GIT_TAG v${VULKAN_VERSION} GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) # 构建Validation Layers FetchContent_Declare( vulkanvalidation GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-ValidationLayers.git GIT_TAG v${VULKAN_VERSION} GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) # 构建glslang(Shader编译前端) FetchContent_Declare( glslang GIT_REPOSITORY https://github.com/KhronosGroup/glslang.git GIT_TAG main GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) # 构建shaderc(完整Shader编译工具链) FetchContent_Declare( shaderc GIT_REPOSITORY https://github.com/google/shaderc.git GIT_TAG main GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) # 构建SPIRV-Cross(SPIR-V转换工具) FetchContent_Declare( spirv_cross GIT_REPOSITORY https://github.com/KhronosGroup/SPIRV-Cross.git GIT_TAG main GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) # 禁用不必要的构建目标,加快编译速度 set(BUILD_VULKANINFO OFF CACHE BOOL "") set(BUILD_TESTS OFF CACHE BOOL "") set(SHADERC_BUILD_EXAMPLES OFF CACHE BOOL "") set(SPIRV_CROSS_BUILD_TESTS OFF CACHE BOOL "") # 按依赖顺序构建 FetchContent_MakeAvailable(vulkanheaders) FetchContent_MakeAvailable(vulkanloader) FetchContent_MakeAvailable(vulkanvalidation) FetchContent_MakeAvailable(glslang) FetchContent_MakeAvailable(shaderc) FetchContent_MakeAvailable(spirv_cross) # 创建项目可执行文件 add_executable(VulkanTest "VulkanTest.cpp" "VulkanTest.h") # 链接所有必要的Vulkan组件 target_link_libraries(VulkanTest PRIVATE Vulkan::Vulkan Vulkan::ValidationLayers glslang::glslang shaderc::shaderc spirv-cross-core ) # 设置C++标准 if(CMAKE_VERSION VERSION_GREATER 3.12) set_property(TARGET VulkanTest PROPERTY CXX_STANDARD 20) endif()
关键配置细节
- 依赖顺序:必须先构建Vulkan-Headers,因为所有其他组件都依赖它的头文件定义。
- 构建选项控制:通过设置
BUILD_TESTS、BUILD_VULKANINFO等选项为OFF,跳过不需要的测试和工具,减少编译时间。 - 使用标准CMake目标:每个组件都会导出官方定义的CMake目标(如
Vulkan::Vulkan、glslang::glslang),直接链接这些目标即可自动处理头文件路径和库依赖,无需手动指定。 - 版本匹配:如果需要严格匹配Vulkan SDK版本,可以将glslang、shaderc等组件的GIT_TAG改为对应SDK版本的标签(比如
v${VULKAN_VERSION}),避免使用main分支。
内容的提问来源于stack exchange,提问作者Metehan Tunçbilek
相关产品推荐
相关产品推荐

