Правильное построение библиотек Фортрана и использование их для создания приложений
Я нашел несколько предыдущих вопросов по этому поводу, но не смог найти что-то конкретное для совета по правильному сопоставлению библиотек и файлов модулей. *.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. В вашем проекте не забудьте вызвать библиотеку-обертку вместо исходной библиотеки.