【问题标题】:"__gfortran_pow_c8_i4" error when linking .o files from g++ and gfortran using g++使用 g++ 从 g++ 和 gfortran 链接 .o 文件时出现“__gfortran_pow_c8_i4”错误
【发布时间】:2013-10-09 12:18:56
【问题描述】:

我正在尝试链接使用 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中尽量避免这些函数或子例程。

【问题讨论】:

  • 在运行链接器时尝试添加-lgfortran
  • @SethMMorton 我得到以下信息:“ld: library not found for -lgfortran”
  • 这很奇怪。我以前用 g++ 成功地使用过它。查看this answer 以确保您输入正确。
  • 啊!您正在使用自制软件,这意味着您的 gcc 安装不知道您的 gfortran 安装(愚蠢的 Apple 不包括带有 XCode 的 fortran 编译器)。我假设您使用的是 linux,在这种情况下,-lgfortran 应该可以工作。
  • 另外,出于好奇,如果你改为使用gfortran -O mycppcode.o myfortrancode.o -lstdc++ 会发生什么?我敢打赌,在这种情况下您不需要添加库搜索路径。

标签: c++ fortran gfortran


【解决方案1】:

以下假设您使用的是 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)。因此,只要包含正确的库,使用一个编译器或另一个编译器来链接应该无关紧要。

【讨论】:

  • @JohnSmith 关于如何在 Fortran 中避免这些子例程和函数的问题,你不能。如果您使用 any Fortran 内置函数,如果您缺少 Fortran 库,您将收到该消息。我猜你使用的是 Fortran POW 函数。
  • Fortran(通常)没有pow 函数,但它可能是通过使用** 运算符调用的。
  • @VladimirF 我已经有一段时间没有使用 Fortran 了……我对内在函数有点生疏了。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 2014-02-16
相关资源
最近更新 更多