使用gfortran编译Fortran函数遇macOS版本不匹配及链接符号未定义报错
解决方案
你遇到的报错分为两类,对应修复方式如下:
1. 解决__gfortran_*系列符号未定义错误
这类错误是因为使用g++执行最终链接时,没有自动关联Fortran运行时库,二选一执行即可:
- 方案1:在原链接命令末尾添加
-lgfortran参数,手动链接Fortran运行时:
g++ main1.o test.o -o run -lgfortran
- 方案2:直接用gfortran执行最终链接,gfortran会自动处理C++标准库的依赖:
gfortran main1.o test.o -o run
2. 解决hello_()符号未定义错误
该错误由C的名字修饰机制导致,需要在C代码中声明Fortran函数时添加extern "C"标记,避免C++修改函数符号名,正确声明示例:
extern "C" void hello_();
如果不想使用带下划线的函数名,可在Fortran函数定义中添加C绑定声明:
subroutine hello() bind(C, name="hello") ! 原有函数逻辑 end subroutine hello
修改后C++中直接声明extern "C" void hello();即可调用,无需加下划线后缀。
3. 可选:消除macOS版本不匹配警告
编译C++和Fortran代码时统一指定最低兼容系统版本即可,修改编译命令:
g++ -c main1.cpp -mmacosx-version-min=11.0 gfortran -c test.f95 -mmacosx-version-min=11.0
内容的提问来源于stack exchange,提问作者startrekisawsome
相关产品推荐
相关产品推荐

