c++ - 使用 g++ 从 g++ 和 gfortran 链接 .o 文件时出现 "__gfortran_pow_c8_i4"错误

标签 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”,以便我以后可以尽量避免在 fortran 中使用这些函数或子程序。

最佳答案

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

关于c++ - 使用 g++ 从 g++ 和 gfortran 链接 .o 文件时出现 "__gfortran_pow_c8_i4"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19148378/

相关文章:

arrays - Fortran 填充数组

java - 在 MacOS 上安装 R 并从源代码编译包 - 使事情正常运行的组件和步骤

fortran - 大型阵列导致 OpenMP 崩溃

linux - 与 gfortran 链接 : _edata: invalid version 21 (max 4)

fortran - 如何确定 gfortran 正在矢量化的内容

c++ - 为什么 ("Maya"== "Maya") 在 C++ 中不是真的?

c++ - 如何在 header 中初始化静态成员

fortran - 使用 Notepad++ 和 Intel Fortran 编译器编译文件

c++ - 从文件读取时无法使用 getline

C++, "Old Fashioned"方式