1

我正在尝试链接使用 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”,以便将来我可以尽量避免在 fortran 中使用这些函数或子例程。

4

1 回答 1

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++

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

于 2013-10-03T02:20:33.337 回答