Подтвердить что ты не робот

Укажите каталог, в котором gfortran должен искать модули

В настоящее время я компилирую программы на основе модулей (таких как основная программа foo, которая зависит от модуля bar) следующим образом:

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

Это отлично работает, когда foo.f90 и bar.f90 находятся в одном каталоге. Как указать каталог, в котором gfortran должен искать bar.o, когда я вызываю use bar в foo.f90? (т.е. я не хочу указывать, что компилятор должен связать bar.o в частности, я просто хочу, чтобы он нашел его.)

4b9b3361

Ответ 1

Вы можете указать gfortran, где ваши файлы модулей (файлы .mod) расположены с флагом компилятора -I. Кроме того, вы можете сообщить компилятору, куда поместить скомпилированные модули с флагом -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

В то время как вышеприведенное выглядит как много усилий для ввода в командной строке, я обычно использую эту идею в своих make файлах.

Для справки эквивалентные флагов компилятора Intel fortran -I и -module. По сути ifort заменяет параметр -J на -module. Обратите внимание, что после модуля есть пробел, но не после J.

Ответ 2

При компиляции исходного кода 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.