C++ &引用__gfortran“战俘”c8“i4”;从g+;链接.o文件时出错+;使用g++;

C++ &引用__gfortran“战俘”c8“i4”;从g+;链接.o文件时出错+;使用g++;,c++,fortran,gfortran,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: "__gfortra

我正在尝试链接一个使用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:

谁能帮我一下吗?我应该使用另一个编译器吗?另外,我想知道什么函数或子例程调用“\uuuu gfortran\upow\uc8\ui4”,这样我以后可以尽量避免在fortran中使用这些函数或子例程。

以下假设您正在使用GNU编译器工具。如果使用其他编译器,情况可能会略有不同

您可以使用任一编译器将两者链接在一起,但需要提供适当的库

通常,您可以使用

gfortran fortobj.o cppobj.o -lstdc++

这假设您使用的设置是两个编译器都知道彼此的库(如通过linux存储库安装)


在OP的情况下,C编译器来自XCode,
gfortran
来自。在这种情况下,
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++


请注意,在最终的可执行文件中不应有任何差异。我不是编译器专家,但我的理解是,使用编译器将对象链接在一起,可以方便地使用与所用语言相关联的适当库调用链接器(
ld
)。因此,只要包含正确的库,使用一个或另一个编译器进行链接就无所谓了。

在运行linker@SethMMorton我得到以下信息:“ld:library not found for-lgfortran”这很奇怪。我以前在g++中成功地使用过它。检查确认你输入的是正确的。啊!您使用的是自制软件,这意味着您的gcc安装不知道您的gfortran安装(愚蠢的苹果没有包含带有XCode的fortran编译器)。我假设您在linux上,在这种情况下,
-lgfortran
应该可以工作。另外,出于好奇,如果您改为
gfortran-O mycppcode.O myfortrancode.O-lstdc++
会发生什么?我打赌在这种情况下,您不需要添加库搜索路径。@JohnSmith关于如何在Fortran中避免这些子例程和函数的问题,您不能。如果您正在使用任何Fortran内置函数,如果您缺少Fortran库,您将收到该消息。我猜您使用的是Fortran
POW
函数。Fortran(通常)没有
POW
函数,但可能是使用
**
运算符调用的。@VladimirF我使用Fortran已有一段时间了。。。我对本质有点生疏。谢谢你指出这一点。
gfortran fortobj.o cppobj.o -L/path/to/c++/libs -lstdc++