我目前编译基于模块的程序(例如foo
依赖于模块的主程序bar
)如下:
gfortran -c bar.f90
gfortran -o foo.exe foo.f90 bar.o
当foo.f90
并且bar.f90
在同一目录中时,这可以正常工作。如何指定bar.o
调用时use bar
gfortran应查找的目录foo.f90
?(即我不想指定编译器应该bar.o
专门链接,我只是想让它找到它。)
-I
您可以使用编译器标志告诉 gfortran 您的模块文件(.mod 文件)的位置。此外,您可以使用编译-J
器标志告诉编译器将已编译模块放在哪里。请参阅gfortran 手册页中的“目录搜索选项”部分。
我使用它们将我的对象(.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
虽然以上看起来在命令行上输入需要付出很多努力,但我通常在我的 makefile 中使用这个想法。
仅供参考,等效的英特尔 fortran 编译器标志是-I
和-module
。本质上 ifort 将-J
选项替换为-module
. 注意 module 后面有一个空格,但 J 后面没有。
编译包含模块的 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
请注意,.mod 需要在 foo.f90 编译时存在。