Fortran模块链路故障

时间:2012-09-26 20:43:12

标签: gfortran fortran95

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

我的问题是,当我尝试在testsrft.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
  5. (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
    

    为什么链接器会抱怨?

1 个答案:

答案 0 :(得分:2)

一些背景知识:

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

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

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

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