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

MinGW64 Clang编译C++程序静态链接失效,如何解决vulkan-1.dll缺失问题?

问题描述

使用MinGW64 Clang编译C++程序,本地编译运行正常,但在其他机器执行时提示:

The code execution cannot proceed because vulkan-1.dll was not found. Reinstalling the program may fix this problem

已添加-static静态链接标志,但问题未解决。以下是当前的Makefile和ldd输出:

Makefile

BUILD_DIR := ./build
SRC_DIR := ./src
INCLUDE_DIR := ./include

# In build dir
TARGET_EXEC := test.exe

COMPILER_EXEC := clang++
COMPILER_ARGS := -iquote "$(INCLUDE_DIR)" -I "./external/GLFW/include" -I "./external/vulkan/include" -static -Wdeprecated -Werror -Wall -Wextra
LINKER_ARGS := -L "./external/glfw/lib-mingw-w64" -L "./external/vulkan/lib" -l:libglfw3.a -l:vulkan-1.lib -lgdi32 -Wdeprecated -Werror -Wall -Wextra


rwildcard = $(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$(d),$(2)) $(filter $(subst *,%,$(2)),$(d)))

SRC_FILES := $(call rwildcard,$(SRC_DIR),*.cpp)
OBJECT_FILES := $(SRC_FILES:%=$(BUILD_DIR)/%.o)

.DELETE_ON_ERROR:
.PHONY: all
all: $(BUILD_DIR)/$(TARGET_EXEC)

# Final executable
$(BUILD_DIR)/$(TARGET_EXEC): $(OBJECT_FILES)
    $(COMPILER_EXEC) $(OBJECT_FILES) $(LINKER_ARGS) -o $@

# Build for c++ sources
$(BUILD_DIR)/%.cpp.o: %.cpp
    mkdir -p $(dir $@)
    $(COMPILER_EXEC) $(COMPILER_ARGS) -c $< -o $@

.PHONY: test
test:
    $(BUILD_DIR)/$(TARGET_EXEC)

.PHONY: clean
clean:
    rm -r $(BUILD_DIR)

ldd输出

$ ldd build/test.exe
        ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x7fff30790000)
        KERNEL32.DLL => /c/Windows/System32/KERNEL32.DLL (0x7fff2fa30000)
        KERNELBASE.dll => /c/Windows/System32/KERNELBASE.dll (0x7fff2dda0000)
        msvcrt.dll => /c/Windows/System32/msvcrt.dll (0x7fff2ff40000)
        USER32.dll => /c/Windows/System32/USER32.dll (0x7fff2f880000)
        win32u.dll => /c/Windows/System32/win32u.dll (0x7fff2e270000)
        vulkan-1.dll => /c/Windows/SYSTEM32/vulkan-1.dll (0x7ffed7fc0000)
        GDI32.dll => /c/Windows/System32/GDI32.dll (0x7fff30510000)
        gdi32full.dll => /c/Windows/System32/gdi32full.dll (0x7fff2e150000)
        msvcp_win.dll => /c/Windows/System32/msvcp_win.dll (0x7fff2dd00000)
        ucrtbase.dll => /c/Windows/System32/ucrtbase.dll (0x7fff2e3e0000)
        ADVAPI32.dll => /c/Windows/System32/ADVAPI32.dll (0x7fff30460000)
        SHELL32.dll => /c/Windows/System32/SHELL32.dll (0x7fff2e5a0000)
        sechost.dll => /c/Windows/System32/sechost.dll (0x7fff30340000)
        RPCRT4.dll => /c/Windows/System32/RPCRT4.dll (0x7fff30220000)
        CFGMGR32.dll => /c/Windows/SYSTEM32/CFGMGR32.dll (0x7fff2d880000)
        VCRUNTIME140.dll => /c/Windows/SYSTEM32/VCRUNTIME140.dll (0x7fff009c0000)
问题原因
  1. -static参数位置错误:当前-static被放在编译阶段的COMPILER_ARGS中,编译时(-c)这个参数无效,静态链接是链接阶段的操作,需要把-static移到LINKER_ARGS里。
  2. Vulkan链接库是动态导入库:你链接的vulkan-1.lib是Windows的动态导入库,对应系统中的vulkan-1.dll,即使启用静态链接,这个依赖依然是动态的——因为Vulkan官方SDK通常不提供全静态的链接库,vulkan-1.lib仅用于引导程序在运行时加载vulkan-1.dll。
解决方案

方案1:修正静态链接参数并替换为Vulkan静态库(如果可用)

  1. 调整-static位置:将COMPILER_ARGS中的-static移到LINKER_ARGS开头,确保链接时静态链接标准库和依赖库:
    LINKER_ARGS := -static -L "./external/glfw/lib-mingw-w64" -L "./external/vulkan/lib" -l:libglfw3.a -l:libvulkan.a -lgdi32 -Wdeprecated -Werror -Wall -Wextra
    
  2. 替换Vulkan库:检查你的Vulkan SDK或MinGW包中是否存在静态库libvulkan.a,如果有,将链接参数中的-l:vulkan-1.lib改为-l:libvulkan.a,并确保-L路径指向包含该静态库的目录。

方案2:使用Vulkan静态加载器(处理动态依赖的优雅方式)

如果无法获取Vulkan静态库,可以通过静态加载器避免启动时的DLL报错,同时允许程序在没有Vulkan的机器上优雅处理:

  1. 定义编译宏:在COMPILER_ARGS中添加-DVK_USE_PLATFORM_WIN32_KHR -DVK_NO_PROTOTYPES。
  2. 加入加载器源码:从Vulkan SDK的src/vulkan目录中复制vulkan.c到你的项目源码目录,编译时将其纳入编译流程。
  3. 修改链接参数:移除-l:vulkan-1.lib,因为加载器会动态加载vulkan-1.dll,而非通过导入表。

这种方式不会消除对vulkan-1.dll的依赖,但程序启动时不会直接崩溃,你可以在代码中检测Vulkan是否可用并给出友好提示。

方案3:打包vulkan-1.dll到程序目录

如果静态链接Vulkan不可行,最直接的解决方法是将vulkan-1.dll与程序打包:

  1. 从你的系统目录(C:\Windows\System32)或Vulkan SDK的Bin目录中复制vulkan-1.dll。
  2. 将该DLL放在程序的同目录下,其他机器运行时会自动加载该文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:27:03