fortran - 在 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.o
并libmain.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.mod
到main.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.
所以我也改变了对main
inside的引用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
这样就修复了文件引用错误,但我仍然没有得到我需要的符号。
解决方案
你根本不能有两个程序。在 Fortran 中是不允许的。
如果您想使用该模块,您可以将其复制到另一个单独的源文件中,而不使用旧程序,或者在现有文件中注释掉旧程序。
您不能同时将两个程序链接在一起。
您尝试的那些技巧只是红鲱鱼,不要尝试使用 .mod 文件或任何东西。只是以某种方式从编译链中删除旧程序。
推荐阅读
- swift - 在 Swift 中删除分组 UITableView 上方的空间
- python - 将 Python 属性绑定到 C++ 扩展上的 C++ 变量
- typescript - 打字稿:在VScode中重命名字符串文字类型
- reporting-services - 无法显示报告。(rsprocessingaborted)在 CRM 2016
- python - 为什么 scipy.optimize.curce 拟合函数不能正确拟合数据点,为什么要给出较大的 pfit 值?
- facebook - 在 Xamarin 中使用 AWS Cognito 成功进行 Facebook 身份验证后无法检索用户数据
- python - 通过 Flask-SQL Alchemy 创建关联对象在 shell 中按预期工作,但在 Flask 路由中产生 JSON 错误
- java - 竞争条件:整数的最小值和最大值范围
- android - 如何将 Activity 转换为 Fragment?
- elasticsearch - 如何搜索多个 geo_distance 查询