我目前基于模块编译程序(例如主程序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
,我只是想让它去找它。)
答案 0 :(得分:21)
您可以使用-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
虽然在命令行上输入上面看起来很费劲,但我通常会在makefile中使用这个想法。
仅供参考,等效的英特尔fortran编译器标志为-I
和-module
。基本上ifort用-J
替换-module
选项。请注意,模块后面有一个空格,但不是在J。
答案 1 :(得分:8)
在编译包含模块的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编译时。