指定gfortran应该查找模块的目录

22

目前我按以下方式编译基于模块的程序(例如主程序foo依赖于模块bar):

gfortran -c bar.f90
gfortran -o foo.exe foo.f90 bar.o

foo.f90bar.f90 在同一个目录下时,这段代码可以正常工作。当我在 foo.f90 中调用 use bar 时,我该如何指定 gfortran 查找 bar.o 的目录呢?(即,我不想特别指定编译器链接 bar.o,我只希望它能够自动查找到。)


你尝试过使用 gfortran -I/path/to/the/obj/file 吗? - ev-br
2个回答

30
您可以使用编译器标志-I告诉gfortran模块文件(.mod文件)的位置。此外,您可以使用编译器标志-J告诉编译器编译后的模块放置在哪里。请参阅gfortran man page中的“目录搜索选项”部分。
我使用这些将我的目标文件(.o文件)和模块文件放置在同一个目录中,但不与所有源文件放置在同一个目录中,以避免杂乱。例如:
SRC = /path/to/project/src
OBJ = /path/to/project/obj
BIN = /path/to/project/bin

gfortran -J$(OBJ) -c $(SRC)/bar.f90 -o $(OBJ)/bar.o
gfortran -I$(OBJ) -c $(SRC)/foo.f90 -o $(OBJ)/foo.o
gfortran -o $(BIN)/foo.exe $(OBJ)/foo.o $(OBJ)/bar.o

虽然以上内容看起来在命令行上需要大量的输入,但我通常在我的 makefiles 中使用这个想法。

仅供参考,相应的 Intel Fortran 编译器标志为 -I-module。本质上,ifort 用 -module 替换了 -J 选项。请注意,模块后面有一个空格,而 J 后面没有。


9

编译包含模块的Fortran源代码时,会创建一个.mod文件(通常文件名与模块名相同),同时还会创建一个目标文件。.mod文件应该与使用该模块的源文件在同一个目录中,或者在编译时使用-I标志指定其路径:

gfortran -c bar.f90 
gfortran -c foo.f90 -I$PATH_TO_MOD_FILE
gfortran -o foo.exe foo.o bar.o

请注意,在编译foo.f90时,必须存在.mod文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接