Использование gfortran с библиотеками - PullRequest
1 голос
/ 27 марта 2012

У меня есть устаревший код, написанный на Fortran 77. Я пытаюсь создать его с помощью Gfortran. Но мне кажется, что происходит сбой на этапе, когда я включаю библиотеки в сборку. Десятки исходных файлов * .f хорошо компилируются, но когда они связаны, я получаю кучу ошибок «неопределенных ссылок», связанных с подпрограммами и функциями, которые определены в моих библиотеках. Сначала я уже запустил make-файл для библиотек, поэтому все нужные мне переменные должны быть экспортированы. Я играю с опцией "-L", но не могу заставить ее работать как нужно.

Во-первых, вот мой синтаксис строки ссылки в моем make-файле:

 29 $(PROGRAM): $(SRCS) $(LIBS)
 30         $(FC) $(FLFLAGS) -o $@ $+ -L$(DIRLIB) 

PROGRAM - это имя программы, SRCS - это все скомпилированные исходные файлы, LIBS настроен на два разных файла - файл архива (file.a) и файл file.o. FC - gfortran, у меня нет конкретных флагов связывания для FLFLAGS на данный момент, и DIRLIB является основным каталогом библиотек. Дело в том, что мои файлы * .o, полученные в результате создания моих библиотек, находятся не в главном каталоге, DIRLIB. DIRLIB содержит несколько каталогов, все со своими собственными * .o файлами, которые нужны моему коду.

Я попытался добавить каждый отдельный каталог после опции -L (например, DIRLIB / DIR1 / *. O DIRLIB / DIR2 / *. O DIRLIB / DIR3 / *. O), но в итоге я получаю ошибки, из-за которых некоторые подпрограммы умножаются определены. Весь этот бизнес пользовательских библиотек и архивных файлов просто смущает меня, и я довольно новичок в создании make-файлов, поэтому я просто делаю снимок в темноте, чтобы кто-то мог помочь мне избавиться от некоторых свет на это.

Ответы [ 2 ]

0 голосов
/ 18 мая 2012

Я попытался собрать этот код снова, используя библиотеку.Это сработало на этот раз.Я почти уверен, что делаю то же самое в моем make-файле, что и раньше, поэтому это должно быть связано с моей библиотекой.Может быть, кто-то изменил его по пути и случайно сломал.Но я получил свежую чистую копию библиотеки.Мои шаги:

1) запустить make-файл для исходных файлов библиотеки;он создает файл архива library.a

2) запустите makefile моего кода:

  • в нем есть строка для указания местоположения этого файла архива и присвоения ему "DIRLIB "

    DIRLIB: = ../library

  • тогда команда связывания make-файла становится

    $ (FC) $ (FLFLAGS) -o $ @ $ + -L $ (DIRLIB) -lskit

FC - мой компилятор, FLFLAGS - мои флаги компоновки, -L - опция, указывающая расположение библиотек, которые должны быть включены, и-lskit - это ключевой параметр, который позволяет использовать библиотеки F77 ... без параметра -lskit я получаю много неопределенных ошибок ссылок.Возможно, в прошлый раз я не включал эту опцию -lskit в конце.

0 голосов
/ 28 марта 2012

Библиотеки должны идти после файлов .o, которые ссылаются на них в команде компоновки.
Я предполагаю, что объектный файл в LIBS идет после библиотеки, но нуждается в некоторых процедурах из нее. Можете ли вы показать команду, которая фактически выполняется (со всеми раскрытыми переменными), чтобы подтвердить это?

...