我试图链接使用g生成的.o文件和使用gfortran生成的另一个.o文件.
g++ -c mycppcode.cpp
生成文件mycppcode.o和命令
gfortran -c myfortrancode.f
生成文件myfortrancode.o
当我链接这两个文件以获取输出文件
g++ -O mycppcode.o myfortrancode.o
我收到以下错误
Undefined symbols for architecture x86_64:
"__gfortran_pow_c8_i4", referenced from:
有人可以帮我这个吗?我应该使用其他编译器吗?另外,我想知道哪些函数或子程序调用“__gfortran_pow_c8_i4”,以便将来可以尝试避免这些函数或子程序.
解决方法:
以下假设您使用的是GNU编译器工具.如果您使用其他编译器,情况可能会略有不同.
您可以使用任一编译器将两者链接在一起,但您需要提供适当的库.
通常,您可以使用其中之一
gfortran fortobj.o cppobj.o -lstdc++
要么
g++ fortobj.o cppobj.o -lgfortran
这假设您正在使用两个编译器相互了解彼此库的设置(如果您通过Linux存储库安装).
在OP的情况下,C编译器来自XCode,gfortran来自homebrew.在这种情况下,gfortran知道g库(因为它们用于编译编译器),但g不知道gfortran库.这就是为什么使用gfortran链接工作如上所述.但是,要与g链接,您需要在使用-L标志调用链接器时添加libgfortran.*的路径,如
g++ fortobj.o cppobj.o -L/path/to/fortran/libs -lgfortran
如果由于某种原因你的gfortran编译器不知道你的g libs,你会这样做
gfortran fortobj.o cppobj.o -L/path/to/c++/libs -lstdc++
请注意,最终的可执行文件应该没有任何区别.我不是编译专家,但我的理解是使用编译器将对象链接在一起是一种方便的方法,可以使用与您正在使用的语言相关联的相应库来调用链接器(类似UNIX的操作系统上的ld).因此,只要包含正确的库,使用一个编译器或另一个编译器链接就无所谓了.