首页 > 解决方案 > 在 Fortran90 中,是否可以将文件中的模块与主程序一起使用?

问题描述

我继承了一些我不想编辑的遗留 Fortran90 代码。该文件main.f90有一个模块,其中包含一些我想在我自己的程序中使用的子程序,但也有一个主程序。它看起来像这样:

module libmain
    implicit none
    contains
    subroutine dostuff
        print *,'m'
    end subroutine dostuff
end module libmain

program main
    use libmain
    implicit none
    call dostuff
end program main

我想libmain在我自己的程序中的文件中使用该模块myprogram.f90,如下所示:

program myprogram
    use libmain
    implicit none
    call dostuff
end program myprogram

我已经尝试了我能想到的一切来完成这项工作。例如:

>gfortran -c main.f90
>gfortran -c myprogram.f90
>gfortran -o myprogram main.o myprogram.o

这失败并出现错误:

duplicate symbol '_main' in:
    main.o
    myprogram.o
ld: 1 duplicate symbol for architecture x86_64
collect2: error: ld returned 1 exit status

我尝试main.o省略最终链接的参数,但这也失败了:

>gfortran -o myprogram myprogram.f90
Undefined symbols for architecture x86_64:
  "___libmain_MOD_dostuff", referenced from:
      _MAIN__ in myprogram.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

有趣的是,如果我删除文件main.olibmain.mod,得到不同的错误:

>rm main.o
>rm libmain.mod
>gfortran -o myprogram myprogram.f90
myprogram.f90:2:8:

     use libmain
        1
Fatal Error: Can't open module file ‘libmain.mod’ for reading at (1): No such file or directory
compilation terminated.

所以gfortran知道它应该在寻找libmain.mod文件,即使我main在尝试链接时没有在参数中包含任何内容myprogram.。那么为什么 gfortran 找不到符号dostuff呢?它显然知道在哪里可以找到文件libmain.mod,这不是问题。

编辑:我尝试了更多技巧,但都没有奏效。

我认为问题可能是gfortran期望.o.mod文件具有相同的名称,所以我重命名:

>mv main.o libmain.o
>gfortran -o myprogram myprogram.f90

Undefined symbols for architecture x86_64:
  "___libmain_MOD_dostuff", referenced from:
      _MAIN__ in ccmD6cx3.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

所以这也行不通。我也尝试了另一种方式,移动libmain.modmain.mod

>rm *.mod
>rm *.o
>gfortran -c main.f90
>gfortran -c myprogram.f90
>mv libmain.mod main.mod
>gfortran -o myprogram myprogram.o
Undefined symbols for architecture x86_64:
  "___libmain_MOD_dostuff", referenced from:
      _MAIN__ in myprogram.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

如果我在编译之前进行重命名myprogram.f90

>rm *.mod
>rm *.o
>gfortran -c main.f90
>mv libmain.mod main.mod
>gfortran -c myprogram.f90
myprogram.f90:2:8:

     use libmain
        1
Fatal Error: Can't open module file ‘libmain.mod’ for reading at (1): No such file or directory
compilation terminated.

所以我也改变了对maininside的引用myprogram.f90

program myprogram
    use main
    implicit none
    call dostuff
end program myprogram

同时保持main.f90不变。现在我执行以下步骤(从头开始):

>rm *.mod
>rm *.o
>gfortran -c main.f90
>mv libmain.mod main.mod
>gfortran -c myprogram.f90 
>gfortran -o myprogram myprogram.o
Undefined symbols for architecture x86_64:
  "___libmain_MOD_dostuff", referenced from:
      _MAIN__ in myprogram.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

这样就修复了文件引用错误,但我仍然没有得到我需要的符号。

标签: fortrangfortranfortran90

解决方案


你根本不能有两个程序。在 Fortran 中是不允许的。

如果您想使用该模块,您可以将其复制到另一个单独的源文件中,而不使用旧程序,或者在现有文件中注释掉旧程序。

您不能同时将两个程序链接在一起。

您尝试的那些技巧只是红鲱鱼,不要尝试使用 .mod 文件或任何东西。只是以某种方式从编译链中删除旧程序。


推荐阅读