2013-04-30 3 views
0

Я работаю над библиотекой Fortran, которая содержит множество различных функций. Для того, чтобы развивать и поддерживать его более легко, я разделил эту библиотеку на несколько модулей (например, part1.f90, part2.f90, part3.f90) и основной модуль mylib.f90, используя все эти отдельные модули:Компиляция и связывание модулей с использованием других модулей

module mylib 
    use part1 
    use part2 
    use part3 
    implicit none 
end module mylib 

Идея затем использовать этот основной модуль в моих программах с use mylib. Однако у меня возникают проблемы с компиляцией и связыванием этих модулей.

Все модули содержатся и скомпилированы в каталоге /mylib/src/, что также содержит соответствующие файлы *.o и *.mod. Когда я компилирую мою программу в другой каталог с помощью:

gfortran -I/mylib/src myprog.f90 -o myprog 

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

Что я здесь делаю неправильно?

Благодарим за помощь!

ответ

2

Я думаю, что вы опускаете ссылку на объектные файлы, в которых должно быть найдено исполняемое представление функций вашего модуля (и т. Д.). С опцией -I вы сообщаете компилятору, где найти включенные файлы (т.е..mod файлов), но нигде вы не говорите ему, чтобы связать файлы .o, которые у вас есть, я полагаю, уже созданы. Простой способ связать их будет редактировать команду компиляции по следующим направлениям:

gfortran -I/mylib/src -o myprog myprog.f90 /mylib/src/part1.o /mylib/src/part2.o ... 

Я полагаю, что если бы я использовал командную строку для компиляции (я не делаю, я использую make или какую-либо другая сборка system) Я знаю, как указать путь к файлам .o только один раз. Кто-то, вероятно, скоро придет сюда и поместит нас обоих в эту конкретную картину, или вы сможете проникнуть в документацию.

+0

Благодарим вас за ответ! Однако я пытался обойти необходимость упоминания всех объектов при связывании моей программы с библиотекой. – remek

0

Я нашел некоторую информацию с других сайтов, смотри, например: http://fortranwiki.org/fortran/show/Library+distribution

Первый подход будет компилировать модули, за исключением *.mod файлов в определенном каталоге, например, /usr/lib/fortran, и создать архив libmylib.a, содержащий файлы *.o, используя ar -r libmylib.a *.o. Затем, чтобы скомпилировать мою программу, я бы добавил флаг -I/usr/lib/fortran, чтобы указать компилятор, где находятся модули, чтобы он мог найти их, когда он встречает use mylib в моем коде. наконец, я бы связал свою программу с архивной библиотекой, используя флаг -lmylib, и указав, где находится архивная библиотека с -L.

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

Второй подход будет включать в себя модули библиотеки в каталоге сборки и скомпилировать их вместе с программой.

Любые другие предложения приветствуются!