使用g ++从g ++和gfortran链接.o文件时出现“__gfortran_pow_c8_i4”错误

时间:2013-10-02 23:21:35

标签: c++ fortran gfortran

我正在尝试链接使用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”,这样我就可以在将来尝试避免这些函数或子程序。

1 个答案:

答案 0 :(得分:4)

以下假设您使用的是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++库,你会这样做

gfortran fortobj.o cppobj.o -L/path/to/c++/libs -lstdc++

请注意,最终的可执行文件不应有任何区别。我不是编译专家,但我的理解是使用编译器将对象链接在一起是一种方便的方法,可以使用与您正在使用的语言相关联的相应库来调用链接器(类似UNIX的操作系统上的ld) 。因此,只要包含正确的库,使用一个编译器或另一个编译器就无关紧要了。