You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 14:05:14