2012-01-13 95 views
13

我目前编译基于模块(如依赖于模块bar主程序foo)程序如下:指定目录下gfortran应该寻找模块

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

能正常工作时foo.f90bar.f90都在相同的目录。如何指定一个目录,gfortran应该寻找bar.o当我打电话的foo.f90use bar? (即,我不想指定编译器应特别链接bar.o,我只是希望它能够找到它。)

+0

后你尝试gfortran -I /路径/到/的/ OBJ /文件? – 2012-01-13 22:05:42

回答

19

你可以告诉gfortran您的模块文件(.mod文件)位于与-I编译器标志。此外,你可以告诉编译器放置编译的模块与-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.

7

当编译一个包含模块的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编译时间。