ifort编译Fortran链接MultiZ库报undefined reference to `main'错误求助
问题成因
- 触发了GNU Make的隐式链接规则:你自定义的规则生成带
.exe后缀的可执行文件,但Make内置的隐式规则会自动尝试将.o文件直接链接为无后缀的同名可执行文件,链接时默认调用cc(C链接器)而非Intel Fortran链接器。C程序的入口符号是main,而Fortran程序编译后入口为编译器自定义的MAIN__类符号,C链接器找不到main符号就会抛出该错误,你的报错信息中make: *** [MyMainScript] Error 1对应的就是生成无后缀MyMainScript文件的隐式规则执行失败。 - 主程序入口定义错误:如果你的
MyMainScript.f90没有以program关键字声明Fortran主程序,而是仅包含子程序/模块,编译后也不会生成入口符号,链接时会报相同错误。 - 库编译器不兼容:如果你的
MultiZ库是用gfortran编译的,和当前的ifort编译器ABI、名称修饰规则不兼容,链接时会出现函数未定义引用的错误。 - 库路径配置错误:如果
LIBPATHS填写的路径下不存在libmultiz.a(静态库)或libmultiz.so(动态库),链接器找不到依赖库也会抛出未定义引用错误。
解决方法
- 禁用Make隐式规则:在Makefile开头添加如下行,关闭内置隐式规则,避免异常的无后缀可执行文件生成:
.SUFFIXES: MAKEFLAGS += --no-builtin-rules
- 校验主程序入口:确认
MyMainScript.f90的结构正确,示例如下:
program MyMainScript use xxx ! 引用用到的模块 implicit none ! 主程序逻辑 end program MyMainScript
- 统一库和主程序的编译器:重新用ifort 2021.2.0编译
MultiZ库,保证和主程序的编译环境一致,避免跨编译器混链的兼容问题。 - 校验库路径配置:到
LIBPATHS填写的路径下确认存在libmultiz库文件,如果使用动态库,运行程序前需要执行如下命令添加库搜索路径:
export LD_LIBRARY_PATH=/RouteToLibrary/:$LD_LIBRARY_PATH
- 测试手动编译验证:可以先执行手动编译链接命令确认逻辑正确,再排查Makefile问题:
# 编译目标文件 ifort -c -g -pg -warn -I/RouteToLibrary/ MyMainScript.f90 -o MyMainScript.o # 链接生成可执行文件 ifort MyMainScript.o -L/RouteToLibrary/ -lmultiz -o MyMainScript.exe
内容的提问来源于stack exchange,提问作者Juan David Navarro
相关产品推荐
相关产品推荐

