20

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

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

foo.f90并且bar.f90在同一目录中时,这可以正常工作。如何指定bar.o调用时use bargfortran应查找的目录foo.f90?(即我不想指定编译器应该bar.o专门链接,我只是想让它找到它。)

4

2 回答 2

28

-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 后面没有。

于 2012-01-16T10:40:00.770 回答
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

请注意,.mod 需要在 foo.f90 编译时存在。

于 2012-01-13T22:33:18.297 回答