当前位置: 首页 > 知识库问答 >
问题:

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

郝冥夜
2023-03-14

共有1个答案

狄奕
2023-03-14

像这些消息这样的链接时错误可能是由于许多与链接器的更广泛使用相同的原因,而不仅仅是编译了一个Fortran程序。其中一些问题包含在关于C++链接的链接问题和这里的另一个答案中:未能指定库,或者以错误的顺序提供它们。

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

如果一个子例程引用打算引用一个内部子例程,那么如果编译器没有提供该子例程intrinsic:它被认为是一个外部子例程,这可能会导致链路时间错误。

  implicit none
  call unsupported_intrinsic
end
undefined reference to `unsupported_intrinsic_'
  implicit none
  intrinsic :: my_intrinsic
  call my_intrinsic
end program

如果my_intrinsic不是受支持的intrinsic,那么编译器将发出一条有用的消息:

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

内部函数没有这个问题,因为我们使用的是隐式none:

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

对于某些编译器,我们可以使用Fortran 2018隐式语句对子程序执行相同的操作

  implicit none (external)
  call my_intrinsic
end
Error: Procedure ‘my_intrinsic’ called at (1) is not explicitly declared
module mod
  implicit none
contains
  integer function sub()
    sub = 1
  end function
end module

  use mod, only :
  implicit none

  integer :: sub

  print *, sub()

end
undefined reference to `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定义和链接对象中都有匹配的名称。

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

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

subroutine s()
end subroutine s
undefined reference to `main'
 类似资料:
  • 如何从Visual Studio读取此错误消息?到底缺少什么线索?这是一个复杂的项目,猜测是一种相当无效的方法——我更愿意确切地知道要寻找什么。 1. 1. 1. 完整的错误列表在这里https://gist.github.com/anonymous/91a76564651be4ac43fc

  • 我得到了这个错误,但我不知道如何修复它。 我正在使用Visual Studio 2013。我将解决方案命名为MyProjectTest这是我的测试解决方案的结构: -功能。H -功能。cpp -main.cpp 我是初学者;这是一个简单的程序,运行时没有错误。我在互联网上阅读并对单元测试感兴趣,因此我创建了一个测试项目: 菜单文件→新建→项目...→已安装→模板→Visual C→测试→本地单元测

  • 我得到未定义的索引错误。我在同一个网站上看到了一个类似类型的问题。我无法修复这个错误,有人能帮助我吗

  • 问题内容: 我正在使用dlopen在运行时加载共享库 在该共享库中,我引用了另一个共享库“ SharedLibarary2.so”中定义的const char *。 可执行文件和两个库都是使用-rdynamic构建的。 但是使用dlopen时,我仍然收到运行时错误:“ / usr / lib / SharedLibarary1.so:未定义符号”,并指向损坏的const char *具有未定义符号

  • 我在导入/导出类时遇到了麻烦。它看起来如此受打击和错过。有时它起作用,有时它不起作用。 我收到以下控制台错误:未捕获的引用错误:测试未在main.js定义: 我已经把这个测试上传到网上http://tibbotts.epizy.com/testClassImport/index.html 我尝试过将“/test.js”更改为“/test.js”、““/test”等。。 我曾尝试在web上搜索解决方

  • 我正在尝试JNI示例代码。 (您可以通过github获得以下所有源代码:https://github.com/pilhoon/jni-test) sample.java sample.c 采样.h 我在CentOS6.3上用gcc编译了这些 但是当我运行'java sample'时,出现了一个错误。 我该怎么解决这个?