如果我理解了手册,它应该可以在文件夹中创建一个包含fortran模块的文件,例如/path/mods/test_mod.f90,即:
module test_mod
implicit none
save
contains
function prod(a,b) result(c)
real :: a,b,c
c=a*b
return
end function
end module
并将其编译为:
gfortran -c test_mod.f90
要创建另一个文件,比如/path/bins/test_prog.f90,即:
program test_prog
use test_mod
real :: x,y,z
x=4e0
y=5e0
z=prod(x,y)
print*,z
end
并将其编译为:
gfortran -I/path/mods -o test_prog test_prog.f90
但由于某些原因,我在mac上遇到链接器错误:
Undefined symbols for architecture x86_64:
"___test_mod_MOD_prod", referenced from:
_MAIN__ in ccz1rsxY.o
ld: symbol(s) not found for architecture x86_64
collect2: ld gab 1 als Ende-Status zurück
在使用Ifort的Suse Linux上尝试相同的操作我得到:
/tmp/ifort2oZUKh.o: In function `MAIN__':
test_prog.f90:(.text+0x4d): undefined reference to `test_mod_mp_prod_'
有人可以在我的黑暗中发光吗?谢谢! PS。:在一个文件中写两个当然是有效的。在网上搜索我发现一些政治家(我坦率地说不明白)说这可能与静态与动态链接有关。
答案 0 :(得分:2)
此
gfortran -c test_mod.f90
应生成两个文件:test_mod.mod
和test_mod.o
。你的其他汇编声明
gfortran -I/path/mods -o test_prog test_prog.f90
正确指定查找.mod
文件的位置,但省略.o
文件。 .mod
文件有点像编译器生成的头文件,它用于编译任何与模块关联的程序单元,但链接需要目标文件。
最简单的(我认为)解决方法是编写
gfortran -o test_prog -I/path/mods /path/mods/test_mod.o test_prog.f90
但你可能想弄清楚。
答案 1 :(得分:1)
您还需要包含.o
文件。也就是说,你应该将其编译为
gfortran -I/path/to/mods -o test_prog test_prog.f90 mods/test_mod.o
这对我来说很有效。