2013-10-02 66 views
0

我想链接使用g ++生成的.o文件和使用gfortran生成的另一个.o文件。“__gfortran_pow_c8_i4”错误链接.o文件从g ++和gfortran使用g ++

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中的这些函数或子例程。

+0

尝试在运行链接器时添加'-lgfortran' – SethMMorton

+0

@SethMMorton我收到以下内容:“ld:找不到-lgfortran的库” –

+0

这很奇怪。我已经用g ++成功地使用过它。看看[这个答案](http://stackoverflow.com/a/5663224/1399279),以确保你输入正确。 – SethMMorton

回答

2

以下假设您使用的是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)以及与正在使用的语言相关的适当库。因此,只要包含正确的库,使用一个编译器或另一个编译器进行链接应该无关紧要。

+0

@JohnSmith关于如何在Fortran中避免这些子例程和函数的问题,你不能。如果您正在使用*任何* Fortran内置函数,那么如果缺少Fortran库,则会收到该消息。我的猜测是你正在使用Fortran'POW'函数。 – SethMMorton

+2

Fortran(通常)没有'pow'函数,但可能是使用'**'运算符调用的。 –

+0

@VladimirF自从我使用Fortran以来,我已经有一段时间了......我对内在的东西有点生疏。感谢您指出了这一点。 – SethMMorton