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

CMake构建Walnut项目时无法找到Vulkan头文件求助

问题:MinGW编译Walnut-cmake项目时找不到vulkan/vulkan.h

我正在构建Walnut-cmake项目,使用Unix Makefiles生成器和MinGW工具链。执行make命令后出现编译错误:

D:/Projekty/C++/Walnut-cmake/Walnut/src/Walnut/Application.h:11:10: fatal error: vulkan/vulkan.h: No such file or directory    
11 | #include "vulkan/vulkan.h"       
   |          ^~~~~~~~~~~~~~~~~ compilation terminated.

Vulkan已正确安装并迁移到C盘默认路径(之前在D盘),我的CMakeLists.txt配置如下:

cmake_minimum_required(VERSION 3.0.0)
project(Walnut CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(Vulkan REQUIRED)
message(STATUS "Found Vulkan: ${Vulkan_LIBRARIES}")
message(STATUS "Vulkan include dirs: ${Vulkan_INCLUDE_DIRS}")
find_package(OpenGL REQUIRED)

include_directories(${PROJECT_NAME} PRIVATE src/Walnut/ImGui ${Vulkan_INCLUDE_DIRS})

#print all include dirs for this project
get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
foreach(dir ${dirs})
message(STATUS "include dir='${dir}'")
endforeach()

file(GLOB_RECURSE ${PROJECT_NAME}_SRC
${CMAKE_CURRENT_SOURCE_DIR}/src/**.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/**.h
)

add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRC})
target_link_libraries(${PROJECT_NAME} PRIVATE ${Vulkan_LIBRARIES})

CMake输出显示已找到Vulkan且包含目录已正确添加:

-- Found Vulkan: C:/VulkanSDK/1.3.268.0/Lib/vulkan-1.lib
-- Vulkan include dirs: C:/VulkanSDK/1.3.268.0/Include

-- include dir='D:/Projekty/C++/Walnut-cmake/Walnut/src'
-- include dir='D:/Projekty/C++/Walnut-cmake/vendor/stb_image'
-- include dir='D:/Projekty/C++/Walnut-cmake/vendor/imgui'
-- include dir='D:/Projekty/C++/Walnut-cmake/vendor/glfw/include'
-- include dir='D:/Projekty/C++/Walnut-cmake/Walnut/Walnut'
-- include dir='D:/Projekty/C++/Walnut-cmake/Walnut/PRIVATE'
-- include dir='D:/Projekty/C++/Walnut-cmake/Walnut/src/Walnut/ImGui'
-- include dir='C:/VulkanSDK/1.3.268.0/Include'

即使手动指定vulkan.h路径,编译仍然失败,求解决办法。


解决方法

1. 修复CMake包含目录配置

你当前使用的include_directories用法错误(第一个参数不应是目标名),且全局配置容易引发冲突。改用目标专属的包含目录设置,确保Vulkan路径只作用于Walnut库:

# 删除原来的include_directories行,替换为:
target_include_directories(${PROJECT_NAME} 
    PRIVATE 
        src/Walnut/ImGui 
        ${Vulkan_INCLUDE_DIRS}
)

2. 验证MinGW与Vulkan SDK的兼容性

Vulkan SDK默认提供MSVC适配的库,但MinGW需要对应环境的文件:

  • 确认C:/VulkanSDK/1.3.268.0/Include/vulkan/vulkan.h确实存在
  • 如果SDK没有MinGW专用库,可通过MSYS2包管理器安装mingw-w64-x86_64-vulkan(提供适配MinGW的头文件和静态库)

3. 彻底清理旧构建缓存

之前Vulkan在D盘的配置缓存可能残留,按以下步骤操作:

  1. 删除项目的build目录
  2. 重新运行CMake生成命令(明确指定MinGW工具链):
    cmake -G "Unix Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ ..
    
  3. 再次执行make

4. 检查编译命令中的包含路径

查看make输出的完整编译指令,确认-IC:/VulkanSDK/1.3.268.0/Include是否存在。如果缺失,可在CMake中强制添加:

target_compile_options(${PROJECT_NAME} PRIVATE -IC:/VulkanSDK/1.3.268.0/Include)

5. 调整头文件引用方式

将代码中的#include "vulkan/vulkan.h"改为#include <vulkan/vulkan.h>,让编译器从指定的系统包含目录中查找,而非当前文件所在目录。


内容的提问来源于stack exchange,提问作者Isembart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:36:06