Правильное построение библиотек Фортрана и использование их для создания приложений

Я нашел несколько предыдущих вопросов по этому поводу, но не смог найти что-то конкретное для совета по правильному сопоставлению библиотек и файлов модулей. *.mod в Makefile. У меня есть каталог проекта с именем project где все исходные файлы для библиотеки находятся в project/srcвсе скомпилировано *.mod файлы помещаются в project/includeи статические библиотеки создаются в каталоге project/lib используя следующее:

ar rc myLibrary.a module1.o module2.o module3.o

После этого я создаю код приложения (программу на Фортране, которая использует эти библиотеки) в каталоге project/applications, У меня сейчас, на корневом уровне (то есть внутри project) создал простой сценарий оболочки, который может собрать приложение. В этой части я не могу заставить процесс работать.

Вот что я делаю:

INCLUDELIB='./include'
LINKLIB='./lib'
INCLUDEOTHER=<include directories for other math libraries>
LINKOTHER=<link directories and link flags for other math libraries>
COMPILER='ifort'
COMPOPTS=<compiler flags, currently I use none>
# building the application:
$COMPILER $COMPOPTS -c ./applications/application.f90 -I$INCLUDELIB $INCLUDEOTHER -L$LINKLIB $LINKOTHER
$COMPILER $COMPOPTS application.o -I$INCLUDELIB $INCLUDEOTHER -L$LINKLIB $LINKOTHER -o application.out

Эта процедура не работает, и это дает Error in opening the compiled module file. Check INCLUDE paths.

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

Любая помощь или совет будет высоко ценится.

1 ответ

Это сообщение, которое вы получаете, когда с библиотекой не все сделано правильно (это не ваша вина!).

*.mod файлы зависят от компилятора, но не *.o файлы: *.mod файлы gfortran не совместимы с *.mod файлы ifort. Поэтому, когда вы создаете библиотеку, вы должны поместить все свои функции и подпрограммы API вне модулей. Например:

не делай этого:

module x
 ...
contains

 subroutine sub_x
  ...
 end subroutine sub_x

end module

но сделайте это вместо этого:

module x
 ...
end module

subroutine sub_x
  use x
  ...
end subroutine sub_x

Таким образом, вы не требуете от пользователей использовать мод-файлы, и вы можете распространять свою библиотеку как .a или .so архив.

В вашем случае библиотека, которую вы используете, почти наверняка была скомпилирована с gfortran, так что вы застряли с gfortran. Решение состоит в том, чтобы написать другую библиотеку в качестве оболочки вокруг исходной библиотеки. Например, сделайте это для каждой функции / подпрограммы, которая вам нужна:

subroutine wrapped_sub_x(arguments)
  use x
  call sub_x(arguments)
end

Затем вы компилируете свою библиотеку-обертку с помощью gfortran в .a архив, и вы связываете его с вашим проектом с помощью ifort. В вашем проекте не забудьте вызвать библиотеку-обертку вместо исходной библиотеки.

Другие вопросы по тегам