2012-09-26 142 views
-1

我是Fortran的新手,所以也许这是一个直截了当的问题,但我还没有找到任何通过查看SO上的类似帖子来工作的解决方案。Fortran模块链接失败

我的问题是,当我试图编译我的主要程序,通过执行

  1. gfortran -c dfft.f
  2. gfortran -c srft.f95
  3. gfortran -c testsrft.f95
  4. 使用在srft.f95定义的模块srftModule testsrft.f95 gfortran dfft.o srft.o testsrft.o -o testsrft

(子程序S IN 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 

为什么连接器抱怨?

+0

链接器找不到'.mod'文件,请参阅http:// stackoverflow。com/questions/8855896/specify-directory-where-gfortran-should-look-for-modules –

回答

2

一些背景资料:

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

未定义的引用错误中引用的符号与模块过程引用的符号的引用模式不匹配。总之,这意味着在主程序中编译器不会认为fftofmat是一个模块过程 - 这是您需要解决的问题。这是违背的,你告诉代码,这样的事情我会找...

  • 是你真正展示你正在使用的代码(代码对比,你认为你键入/想代码是相关的) - 使用语句是否存在,模块过程名拼写是否正确,模块中没有私有语句,主程序中的引用不在主机关联名称被隐藏的内部过程中,等等?
  • 源文件是否全部编译没有错误?是否有从先前成功编译的“遗留”mod文件,可以从当前编译的mod文件中优先选择?

虽然我不认为这是问题的原因,但请注意,有些系统对链接步骤中的对象文件和库的排序非常敏感 - 更多的是在文件中搜索符号它遵循引用命令行上特定符号的文件。要保持健壮,您应该以相反的顺序排列目标文件。

+0

我显然没有在主程序中使用srftModule行......我可以发誓我做了!谢谢。 – AatG