C++调用GetFileVersionInfo获取DLL/EXE版本时链接错误如何解决
解决方案
问题根因
你遇到的链接报错本质是MinGW GCC下version库的链接配置错误,主要由两个常见原因导致:
- 链接顺序错误:GCC的链接器
ld对参数顺序敏感,依赖库需要放在依赖它的目标文件之后,你当前将-lversion插入到-static之前的写法可能触发顺序问题 - 链接标志作用域错误:
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
相关产品推荐
相关产品推荐

