-1

我是 Fortran 的新手,所以也许这是一个简单的问题,但是通过查看 SO 上的类似帖子,我还没有找到任何可行的解决方案。

我的问题是,当我尝试在 testrft.f95 中编译我的主程序时,该程序使用 srft.f95 中定义的模块 srftModule 通过执行

  1. gfortran -c dfft.f
  2. gfortran -c srft.f95
  3. gfortran -c testsrft.f95
  4. gfortran dfft.o srft.o testsrft.o -o testsrft

(srftModule 中的子程序需要 dfft.f 中的 Fortran77 代码),我得到链接器错误

testsrftF.o: In function `MAIN__':
testsrftF.f95:(.text+0x98): undefined reference to `fftofmat_'
collect2: ld returned 1 exit status

模块定义如下

module srftModule
   implicit none
   contains
   ... (some subroutines)

   subroutine fftofmat(A)
     implicit none
     real*8, dimension(:, :), intent(inout) :: A
     ...
   end subroutine fftofmat

   ... (some more subroutines)

end module srftModule

在我的主文件中,我有

program testsrft
   use srftModule
   implicit none

   ...(code to initialize a 10x10 matrix A)
   call fftofmat(A)

 end program testsrft

为什么链接器抱怨?

4

1 回答 1

2

一些背景:

  • MAIN__ 是 gfortran 用于主程序的符号。
  • 通常,编译器会修改模块过程的符号名称以包含主机模块的名称。在 gfortran 的情况下,符号看起来像 __ modulename _MOD_ procedurename

未定义引用错误中引用的符号与模块过程引用的符号模式不匹配。总之,这意味着在主程序中编译器不认为 fftofmat 是一个模块过程——这是你需要解决的问题。这与您显示的代码相反,所以我要寻找的东西......

  • 您显示的代码是否真的是您正在使用的代码(相对于您认为您输入/认为相关的代码) - use 语句在那里,模块过程名称拼写正确,模块中没有私有语句,主程序中的引用不在内部过程中,主机关联名称以某种方式隐藏,等等?
  • 源文件是否全部编译没有错误?是否有来自先前成功编译的“剩余” mo​​d 文件可以优先于当前编译中的 mod 文件被拾取?

虽然我认为这不是您的问题的原因,但请注意,某些系统在链接步骤中对目标文件和库的顺序(更是如此)很敏感 - 在引用的文件后面的文件中搜索符号命令行上的特定符号。为了更健壮,您应该以相反的方式订购目标文件。

于 2012-09-27T00:30:07.010 回答