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

C++调用GetFileVersionInfo获取DLL/EXE版本时链接错误如何解决

解决方案

问题根因

你遇到的链接报错本质是MinGW GCC下version库的链接配置错误,主要由两个常见原因导致:

  1. 链接顺序错误:GCC的链接器ld对参数顺序敏感,依赖库需要放在依赖它的目标文件之后,你当前将-lversion插入到-static之前的写法可能触发顺序问题
  2. 链接标志作用域错误:CMAKE_EXE_LINKER_FLAGS仅对可执行文件生效,如果你当前编译的是DLL目标,该配置不会生效,也就不会链接version库

具体修复方法

方案1:推荐使用CMake原生目标链接配置(最稳妥)

不要直接修改全局链接标志,针对你的编译目标单独添加链接依赖即可,CMake会自动处理链接顺序和作用域问题:

# 假设你的EXE目标名为MyApp,DLL目标名为application_x86
# 给EXE目标添加version库依赖
target_link_libraries(MyApp PRIVATE version)
# 给DLL目标添加version库依赖
target_link_libraries(application_x86 PRIVATE version)

你可以把这两行配置加到你定义完对应目标(add_executable/add_library)的后面即可,原来的CMAKE_EXE_LINKER_FLAGS配置可以改回原来的版本,不需要加-lversion。

方案2:修改全局链接标志(适合多目标批量配置)

如果你确实需要通过全局标志配置,需要同时覆盖可执行文件和共享库的链接标志,并且把-lversion放到所有参数的最后:

# 同时配置EXE和DLL的链接标志,-lversion放在最末尾
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static -lversion")
set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static -lversion")

验证方法

修改配置后删除原有构建目录的缓存,重新执行cmake构建即可,不再会出现对应函数的未定义引用报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:45:07