什么是未定义的引用/未解析的外部符号错误以及如何在 Fortran 中修复它?

2023-12-27

我正在尝试构建 Fortran 程序,但收到有关未定义引用或未解析的外部符号的错误。我见过另一个问题 https://stackoverflow.com/q/12573816关于这些错误,但答案大多是针对 C++ 的。

使用 Fortran 编写时出现这些错误的常见原因是什么?如何修复/预防它们?


这是构建 Fortran 程序时出现的一系列错误的典型问题。如果您被推荐到这里,或者您的问题作为与此问题重复的问题而被关闭,您可能需要阅读几个答案中的一个或多个。从...开始这个答案 https://stackoverflow.com/a/66871155/它充当所提供解决方案的目录。


像这些消息这样的链接时错误的原因可能与链接器的更一般用途相同,而不仅仅是编译了 Fortran 程序。其中一些已包含在链接问题 https://stackoverflow.com/q/12573816/3157076关于 C++ 链接和另一个答案 https://stackoverflow.com/a/66860223/3157076这里:未能指定库,或以错误的顺序提供它们。

然而,编写 Fortran 程序时存在一些常见错误,可能会导致链接错误。

不支持的内在函数

如果子例程引用旨在引用内部子例程,那么如果编译器未提供该子例程内部函数,则可能会导致链接时错误:它被视为外部子例程。

  implicit none
  call unsupported_intrinsic
end

With unsupported_intrinsic编译器不提供我们可能会看到链接错误消息,例如

undefined reference to `unsupported_intrinsic_'

如果我们使用非标准或不常见实现的内在函数,我们可以通过多种方式帮助编译器报告这一点:

  implicit none
  intrinsic :: my_intrinsic
  call my_intrinsic
end program

If my_intrinsic不是受支持的内在函数,那么编译器会抱怨一条有用的消息:

Error: ‘my_intrinsic’ declared INTRINSIC at (1) does not exist

我们本质上不存在这个问题功能因为我们正在使用implicit none:

  implicit none
  print *, my_intrinsic()
end
Error: Function ‘my_intrinsic’ at (1) has no IMPLICIT type

通过某些编译器,我们可以使用 Fortran 2018implicit对子例程执行相同操作的语句

  implicit none (external)
  call my_intrinsic
end
Error: Procedure ‘my_intrinsic’ called at (1) is not explicitly declared

注意,编译时可能需要指定编译器选项,以请求编译器支持非标准内在函数(如 gfortran 的-fdec-math)。同样,如果您请求符合特定语言修订版,但使用后续修订版中引入的内在函数,则可能需要更改一致性请求。例如,编译

  intrinsic move_alloc
end

与 gfortran 和-std=f95:


   intrinsic move_alloc
                      1
Error: The intrinsic ‘move_alloc’ declared INTRINSIC at (1) is not available in the current standard settings but new in Fortran 2003. Use an appropriate ‘-std=*’ option or enable ‘-fall-intrinsics’ in order to use it.

外部过程代替模块过程

正如我们可以尝试在程序中使用模块过程,但忘记将定义它的对象提供给链接器一样,我们可能会意外地告诉编译器使用外部过程(具有不同的链接符号名称)而不是模块过程:

module mod
  implicit none
contains
  integer function sub()
    sub = 1
  end function
end module

  use mod, only :
  implicit none

  integer :: sub

  print *, sub()

end

或者我们可能根本忘记使用该模块。同样,当我们错误地引用外部过程而不是引用外部过程时,我们经常会看到这种情况兄弟模块过程 https://stackoverflow.com/q/3970798/3157076.

Using implicit none (external)当我们忘记使用模块时可以帮助我们,但这不会捕获我们显式声明该函数为外部函数的情况。我们必须小心,但是如果我们看到像这样的链接错误

undefined reference to `sub_'

那么我们应该认为我们已经引用了一个外部过程sub而不是模块过程:没有任何“模块名称空间”的名称修改。这是我们应该寻找的强烈暗示。

错误指定的绑定标签

如果我们与 C 进行互操作,那么我们很容易错误地指定符号的链接名称。当不使用标准互操作性工具时,这非常容易,我不会费心指出这一点。如果您看到与 C 函数相关的链接错误,请仔细检查。

如果使用标准设施,仍然有可能出错。区分大小写是一种方法:链接符号名称区分大小写,但如果不是全部较小,则必须告知 Fortran 编译器这种情况:

   interface
     function F() bind(c)
       use, intrinsic :: iso_c_binding, only : c_int
       integer(c_int) :: f
     end function f
  end interface

  print *, F()
end

告诉 Fortran 编译器向链接器询问符号f,即使我们称之为F这里。如果该符号确实被称为F,我们需要明确地说:

   interface
     function F() bind(c, name='F')
       use, intrinsic :: iso_c_binding, only : c_int
       integer(c_int) :: f
     end function f
  end interface

  print *, F()
end

如果您看到因情况而异的链接错误,请检查您的绑定标签。

这同样适用于具有绑定标签的数据对象,并且还要确保具有链接关联的任何数据对象在任何 C 定义和链接对象中具有匹配的名称。

同样,忘记指定 C 的互操作性bind(c)意味着链接器可能会查找带有一个或两个尾部下划线的损坏名称(取决于编译器及其选项)。如果您尝试链接 C 函数cfunc但链接器抱怨cfunc_,检查你是否说过bind(c).

不提供主程序

除非另有说明,编译器通常会假设它正在编译主程序以便(使用链接器)生成可执行文件。如果我们不编译主程序,那不是我们想要的。也就是说,如果我们正在编译一个模块或外部子程序,以供以后使用:

module mod
  implicit none
contains
  integer function f()
    f = 1
  end function f
end module

subroutine s()
end subroutine s

我们可能会收到这样的消息

undefined reference to `main'

这意味着我们需要告诉编译器我们没有提供 Fortran 主程序。这通常会与-c标志,但如果尝试构建库对象,将会有不同的选项。在这种情况下,编译器文档将提供适当的选项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是未定义的引用/未解析的外部符号错误以及如何在 Fortran 中修复它? 的相关文章

  • 使用 MPI 派生数据类型

    我正在学习 Fortran 中的 BCASTing 数据类型 并且有一个代码可以从终端获取两个值并将它们显示在每个进程上 对于整数 整数和整数 实数类型的组合 value1 value2 这是有效的 但是对于整数 实数 8 的组合 它会失败
  • 在 fortran 中生成序列数组

    Fortran中是否有一个内在函数可以生成一个包含从a到b的数字序列的数组 类似于python的range gt gt gt range 1 5 1 2 3 4 gt gt gt range 6 10 6 7 8 9 不 没有 但是 您可以
  • CMake 链接错误(未定义的引用)

    我正在使用 SSL Vision 软件 它有一个示例客户端 我一直试图将其与整个项目分开 我找到了自己编辑客户端所需的源代码 因此我只是从软件中复制它们并使用 CMake 来构建我的客户端 下面的项目结构经过简化 缩小了问题范围 我相信 C
  • 如何为 Fortran 95+ 模块库提供显式接口,并隐藏实现

    我正在使用 gfortran 的 95 扩展 我有一个实用程序模块库 我想链接到其他项目 即作为库或共享对象 dll 但是 在 Fortran 中 我不明白如何在不维护模块接口的两个副本的情况下将接口与 Fortran 中的实现分离 在 C
  • 不确定 openmp 循环中应该共享或私有什么

    我有一个更新矩阵 A 的循环 我想将其设为 openmp 但我不确定哪些变量应该共享和私有 我本以为只有 ii 和 jj 就可以工作 但事实并非如此 我想我也需要在某个地方进行 OMP ATOMIC UPDATE 该循环仅计算 N 和 N
  • Fortran 中指数函数的 DEXP 或 EXP?

    我有两个非常简短的问题 1 我刚刚读到DEXP is the archaic的形式EXP 这是否意味着不应再使用它 我一直以为DEXP 双精度等于EXP 2 指数函数的范围是多少 它依赖于编译器吗 问题 1 在现代 Fortran 中 最好
  • C++/CLR 托管单元测试存在链接器错误

    当将任何托管类包含到我的托管单元测试中时 编译会输出以下错误 1 gt UnitTest obj error LNK2020 unresolved token 0A000360 extern C int cdecl CrtDbgReport
  • 使用 Visual Studio 2013 和 Intel Fortran 编译混合 C++/C 代码

    我正在尝试编译一个简单的 C Fortran 混合程序 但存在链接问题 我使用的是Visual Studio 2013 Ultimate和Intel Visual Fortran Compiler XE 14 该程序非常简单 是从网上的某个
  • 可变格式

    我编写了一个程序来计算平方有限差分矩阵 您可以在其中输入行数 等于列数 gt 这存储在变量矩阵中 该程序运行良好 program fin diff matrix implicit none integer dimension allocat
  • 编译错误:无法打开模块文件

    我有这个代码 PROGRAM xfit driver for routine fit USE nrtype USE nrutil USE nr USE ran state ONLY ran seed IMPLICIT NONE INTEGE
  • Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

    我想通过以下方式实现有用的数组操作 添加元素 删除元素 通过可分配 指针 二叉树结构实现不同的实现 class 特征 无限多态性 我使用 gfortran 5 0 应该可以处理这样的功能 我需要它 以免为我使用的每种类型重复相同的代码 这应
  • Fortran 函数:指针作为实际参数,目标作为形式

    我正在尝试破译 Fortran 代码 它将指向函数的指针作为实际参数传递 而形式参数则是目标 它在主程序中定义并分配一个 globalDATA 类型的指针 然后调用一个传递该指针的函数 module dataGLOBAL type glob
  • 解决源自 .lib 文件的“本地定义的符号”和“未解析的外部符号”

    我正在尝试在 Windows 7 64 位上的 Visual C 2010 上使用开源库 GDCM 编译我的项目 我已在我的项目中包含了所需的 lib 文件 gdcmDSED lib 和 gdcmMSFF lib 但是 编译器抱怨超过 10
  • Fortran PURE 函数可以使用全局参数吗?

    在我看来 Fortran 中所谓的纯函数对于那些使用函数式编程的人来说似乎不够纯粹 这是我的问题 假设我有以下代码 MODULE basics IMPLICIT NONE INTEGER PARAMETER dp kind 1 0d0 RE
  • 纯 Fortran 过程中的 I/O

    我正在尝试将错误检查合并到我正在编写的纯过程中 我想要这样的东西 pure real function func1 output unit a implicit none integer a output unit if a lt 0 th
  • 重复符号_OBJC_CLASS_$_LoginController

    我知道这个问题以前已经被问过很多次了 但到目前为止还没有解决我的问题 我知道当您在项目中获得文件的多个副本时 会发生此错误 我尝试清理构建 删除任何登录控制器 m文件输入编译源然后构建 很好 没有错误 当我在编译源中添加 LoginCont
  • 最佳 Fortran IDE [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 stackoverflow上有人用Fortran吗 您使用什么 IDE 您认为哪一个是最好的 似乎我周围的很多人都对 Intel Visu
  • LNK2028 托管 C++ DLL 在另一个托管 C++ DLL 中调用函数

    我正在将 VS2010 与托管 C DLL 一起使用 调用另一个托管 C DLL 中的函数 并且我得到了很多LNK2028 http msdn microsoft com en us library ms235590 28v vs 80 2
  • 如何读取 Fortran 中内容不以空格分隔的 2D 文件

    我有一个矩阵存储在文件 number txt 中 如下所示 12323456 54254311 76534522 我如何在 Fortran 中读取这样的矩阵 结果将是 1 2 3 2 3 4 5 6 5 4 2 5 4 3 1 1 7 6
  • Python 读取未格式化的直接访问 Fortran 90 给出不正确的输出

    这是数据的写入方式 它是一个二维浮点矩阵 我不确定大小 open unit 51 file rmsd nn output form unformatted access direct status replace recl Npoints

随机推荐

  • 如何将异常从一个进程传递到另一个进程?

    如果停止函数中的运行状态为 停止 我想在上传函数中引发异常 这似乎不起作用 我正在使用 Pipe 来传递异常 怎么了 def upload instances u1 for instance in instance try u1 recv
  • iOS/Android 检测和重定向

    js新手 慢慢来 D 需要根据用户使用的操作系统进行重定向 如果ios重定向到x 如果android重定向到y 否则 留在原来的地址 我的问题 这些片段够了吗
  • 从 Shell 输出生成文档

    有没有一种方法 工具可以直接从我的 Shell 输出甚至保存的日志生成 HTML 文档 类似于 doxygen 的作用 如果没有可用的东西 你们对如何使用现有工具做到这一点有什么创意吗 我想 在打字时 我可以放置某种标记或特殊字符 然后让一
  • C# 从一个列表中减去另一个列表或检查一个列表是否完全包含在另一个列表中

    如何从一个列表中减去另一个列表 List
  • Python 3.5+ 中类型提示的动态检查[重复]

    这个问题在这里已经有答案了 The typing https docs python org 3 library typing html模块在 Python 3 5 中实现类型提示 然而 这并不是强制执行的 它目前似乎只是为了静态类型检查器
  • 在 Google People API 中未给出的特定时间后更新联系人条目的选项

    我们使用 Google Contacts API 获取在特定时间后更新的联系人条目 以便在我们端保留联系人的更新副本 在 Google Contacts API 中 有一个选项可以使用以下命令在特定时间后更新联系人条目 更新分钟 https
  • 使用 Python 识别 Mac OS X 中的包目录

    Mac OS X Finder 使用 包 的概念使某些文件夹的内容对用户不透明 我在用着os walk 枚举目录树 并且我想跳过对应用程序包等包的枚举 The mdls命令行实用程序可用于检查是否com apple package在里面kM
  • XSL:只有文件名,没有路径

    我是 XSL 编程新手 我想这是一个简单的问题 如何获取没有路径的文件名 目前我的代码如下所示 我得到了整个路径 结果 xml
  • Spring集成测试不回滚

    我正在使用 Spring Hibernate H2 我在集成测试中执行数据库操作 通过调用服务类 我希望 Spring 在每个测试方法之后回滚更改 但我无法让它工作 起初我使用MySQL 带有MyISAM 不支持事务 但是换成H2后问题仍然
  • 使用 $lookup mongodb 填充到深层

    我正在使用 lookup 加入两个集合并从以下查询中获取数据 let condition status ne config PROJECT STATUS completed assignId mongoose Types ObjectId
  • 具有最大高度和最大宽度的响应式图像

    我有这个 html 和 CSS div class kalim img src div CSS kalim display inline block kalim img max width 800px width auto max heig
  • Hibernate 和 Jackson 惰性序列化

    我正在开发一个使用 Hibernate 和 Jackson 来序列化我的对象的项目 我想我明白它应该如何工作 但我无法让它发挥作用 如果我理解得很好 一旦关系获取模式设置为LAZY 如果你想要这个关系 你就必须初始化它 这是我的课程 Ent
  • TensorFlow 中 AdamOptimizer 的学习率不会改变

    我想看看训练期间学习率如何变化 打印出来或创建摘要并在张量板上可视化 这是我迄今为止所掌握的代码片段 optimizer tf train AdamOptimizer 1e 3 grads and vars optimizer comput
  • 通过 Composer 安装或复制供应商文件夹

    我想知道 在部署基于 Composer 的项目时 为什么大多数人建议通过 SSH 连接到服务器并安装 Composer 并下载依赖项 如下所示 curl sS https getcomposer org installer php mv c
  • Angular ng-click 在 Bootstrap 下拉菜单中不起作用

    我有一些基于 Bootstrap 3 下拉菜单的过滤器 但由于某些奇怪的原因 它们在实际的下拉菜单中不起作用 但如果我复制粘贴它并将其放在外面 它就可以正常工作 div div class btn group div div
  • 限制相机旋转角度

    我希望能够在某个点之后限制相机旋转 并且只能在某个区域内旋转 这是到目前为止的代码 void Update float mouseX Input GetAxis Mouse X float mouseY Input GetAxis Mous
  • 有没有办法使用 wrk 将参数传递给 GET 请求?

    我需要对以参数作为输入的 REST API 进行基准测试 我想知道是否有办法使用wrk 现在我没有看到这样的选项 user Ubuntu K56CA wrk wrk Usage wrk
  • 如何设置默认使用的 php.ini,OSX Yosemite

    我使用 OSX Yosemite 设置了一个新环境 我正在使用内置的 PHP 我想更改 php ini 中的一些配置 例如 date timezone 但尽管重新启动了 apache 服务器 sudo apachectl restart 但
  • 逐字字符串文字 v 转义序列

    C 编译器或 NET 运行时处理逐字字符串文本与使用转义序列 即性能 的方式有什么区别 还是只是设计时风格的问题 例如 var pathA c somewhere var pathB c somewhere 我想它们的编译方式是相同的 这并
  • 什么是未定义的引用/未解析的外部符号错误以及如何在 Fortran 中修复它?

    我正在尝试构建 Fortran 程序 但收到有关未定义引用或未解析的外部符号的错误 我见过另一个问题 https stackoverflow com q 12573816关于这些错误 但答案大多是针对 C 的 使用 Fortran 编写时出