CMake链接C++与Fortran的libgfortran不兼容报错
问题性质判定
该报错完全属于开发环境配置问题,与代码逻辑、跨语言调用语法正确性无关。
报错根因拆解
- 当前调用的链接器为
x86_64-w64-mingw32架构9.2.0版本的64位链接器,仅能加载同架构、与当前编译链版本匹配的64位Fortran运行库文件 - 链接器搜索路径下的
libgfortran.dll.a、libgfortran.a属于32位MinGW6.3.0版本的Fortran运行库,架构与版本均不兼容,因此被链接器直接跳过,最终因找不到符合要求的gfortran运行库,抛出cannot find -lgfortran错误 - 该报错触发过程与
main.cpp的C++调用逻辑、f_add.f的Fortran实现代码、基础CMake配置无关联,即使代码完全符合跨语言调用规范,只要存在架构/版本不匹配就会复现该问题
极简解决方案(适配低维护需求)
全程不需要修改现有业务代码,仅需调整环境配置:
- 移除现有32位MinGW6.3.0的Fortran组件,安装与当前C编译链完全同版本、同架构的配套gfortran:即匹配
x86_64-w64-mingw329.2.0版gcc/g的64位gfortran9.2.0组件,安装时确认该组件的库文件路径与现有gcc的库路径处于同一根目录下 - CMake配置保持极简即可,无需手动指定gfortran库路径:
CMake会自动匹配与当前gcc版本一致的gfortran运行库,自动完成链接流程,无需手动添加enable_language(Fortran) add_executable(目标程序名 main.cpp f_add.f)-lgfortran链接指令,也无需手动设置库搜索路径 - 删除原有build目录下的CMake缓存,重新执行CMake配置与编译即可
注意事项
- 不要手动引入来源不明的第三方gfortran库,只要保证gfortran与当前使用的gcc/g++属于同一套MinGW发行版组件,就不会出现架构不兼容问题
- 包含大量goto的老旧Fortran77代码无需做逻辑修改,同版本gfortran可正常编译,CMake会自动处理跨语言的符号名转换适配,无需在C++端编写复杂的
extern "C"适配逻辑
内容的提问来源于stack exchange,提问作者user7431005
相关产品推荐
相关产品推荐

