gfortran编译AMOS库报ZABS参数过多错误如何解决
报错原因
该错误和源码逻辑无关,是gfortran默认的内置函数匹配规则导致的:Fortran标准内置的ZABS函数仅接收1个复数类型参数,而AMOS库中自定义的ZABS函数是接收两个双精度参数(分别对应复数的实部ZR、虚部ZI)的旧版实现,二者重名后编译器优先匹配了内置函数的签名,因此抛出参数过多的错误。
修复方法
最简便的方案是在编译所有Fortran源文件时添加-fno-builtin编译选项,告知gfortran不要自动替换为内置函数实现,优先使用源码内自定义的函数逻辑。
你只需要在原有每条gfortran编译命令中加入该参数即可,修改后的完整编译命令如下:
gfortran -fno-builtin -c -o d1mach.o d1mach.f gfortran -fno-builtin -c -o dgamln.o dgamln.f gfortran -fno-builtin -c -o i1mach.o i1mach.f gfortran -fno-builtin -c -o xerror.o xerror.f gfortran -fno-builtin -c -o zacai.o zacai.f gfortran -fno-builtin -c -o zairy.o zairy.f gfortran -fno-builtin -c -o zasyi.o zasyi.f gfortran -fno-builtin -c -o zbknu.o zbknu.f gfortran -fno-builtin -c -o zdiv.o zdiv.f gfortran -fno-builtin -c -o zexp.o zexp.f gfortran -fno-builtin -c -o zkscl.o zkscl.f gfortran -fno-builtin -c -o zlog.o zlog.f gfortran -fno-builtin -c -o zmlri.o zmlri.f gfortran -fno-builtin -c -o zmlt.o zmlt.f gfortran -fno-builtin -c -o zs1s2.o zs1s2.f gfortran -fno-builtin -c -o zseri.o zseri.f gfortran -fno-builtin -c -o zshch.o zshch.f gfortran -fno-builtin -c -o zsqrt.o zsqrt.f gfortran -fno-builtin -c -o zuchk.o zuchk.f gfortran -fno-builtin -c -o zabs.o zabs.f ar rv airy.a d1mach.o dgamln.o i1mach.o xerror.o zacai.o zairy.o zasyi.o zbknu.o zdiv.o zexp.o zkscl.o zlog.o zmlri.o zmlt.o zs1s2.o zseri.o zshch.o zsqrt.o zuchk.o zabs.o
如果不想修改编译参数,也可以通过改源码的方式修复:将zabs.f中的函数名修改为不和内置函数冲突的名称(例如amos_zabs),再全局替换所有源文件中调用ZABS的位置为新函数名即可,该方案不需要额外编译参数,但改动源码的工作量更高。
额外提示:由于你后续需要将编译出的静态库链接到Rust程序,建议在编译时额外加上
-fPIC参数生成位置无关代码,避免链接阶段出现重定位相关错误。
内容的提问来源于stack exchange,提问作者Gian Laager
相关产品推荐
相关产品推荐

