C++ &引用__gfortran“战俘”c8“i4”;从g+;链接.o文件时出错+;使用g++;
我正在尝试链接一个使用g++生成的.o文件和另一个使用gfortran生成的.o文件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++ -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库,您将收到该消息。我猜您使用的是FortranPOW
函数。Fortran(通常)没有POW
函数,但可能是使用**
运算符调用的。@VladimirF我使用Fortran已有一段时间了。。。我对本质有点生疏。谢谢你指出这一点。
gfortran fortobj.o cppobj.o -L/path/to/c++/libs -lstdc++