目前我按以下方式编译基于模块的程序(例如主程序foo
依赖于模块bar
):
gfortran -c bar.f90
gfortran -o foo.exe foo.f90 bar.o
当 foo.f90
和 bar.f90
在同一个目录下时,这段代码可以正常工作。当我在 foo.f90
中调用 use bar
时,我该如何指定 gfortran 查找 bar.o
的目录呢?(即,我不想特别指定编译器链接 bar.o
,我只希望它能够自动查找到。)
目前我按以下方式编译基于模块的程序(例如主程序foo
依赖于模块bar
):
gfortran -c bar.f90
gfortran -o foo.exe foo.f90 bar.o
当 foo.f90
和 bar.f90
在同一个目录下时,这段代码可以正常工作。当我在 foo.f90
中调用 use bar
时,我该如何指定 gfortran 查找 bar.o
的目录呢?(即,我不想特别指定编译器链接 bar.o
,我只希望它能够自动查找到。)
-I
告诉gfortran模块文件(.mod文件)的位置。此外,您可以使用编译器标志-J
告诉编译器编译后的模块放置在哪里。请参阅gfortran man page中的“目录搜索选项”部分。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 后面没有。
编译包含模块的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