2012-03-27 4 views
1

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

Во-первых, вот мой синтаксис связующей линии в моем Makefile:

29 $(PROGRAM): $(SRCS) $(LIBS) 
30   $(FC) $(FLFLAGS) -o [email protected] $+ -L$(DIRLIB) 

ПРОГРАММА это название программы, SRCS являются все скомпилированные исходные файлы, ЛИЭС установлен в двух различных файлов - архивный файл (file.a) и файл file.o. FC - gfortran, на данный момент у меня нет каких-либо конкретных флагов привязки для FLFLAGS, а DIRLIB - основной каталог библиотек. Дело в том, что мои файлы * .o, возникшие в результате создания моих библиотекарей, не находятся в основном каталоге DIRLIB. DIRLIB содержит несколько каталогов, все с их собственными * .o-файлами, которые необходимы моему коду.

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

+0

Я не знаю ответа на ваш вопрос, но попробовал ли вы * readelf -a * команду в любом из файлов * \ *. O *? * Readelf * по крайней мере скажет вам, какие символы, если таковые имеются, пытается найти компоновщик. Это может дать вам понять, что делать дальше. Удачи. – thb

ответ

0

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

+0

Простите, что это заняло так много времени, чтобы вернуться к этому, но я получил побочную работу с другой работой. Я узнал, что общий процесс состоит в том, чтобы скомпилировать исходные файлы, которые находятся в библиотеке, а затем включить файлы .o в файле .a, который вы должны включить в этап компоновки. К сожалению, я просто не мог заставить это работать, поэтому я просто взял исходные файлы библиотеки и просто построил их прямо вместе с основными исходными файлами программы и сразу связал их ... не использовать параметр -L или messing требуются статические библиотеки. – rks171

0

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

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

2) Запускаем мой код Makefile:

  • имеет линию, чтобы указать местоположение этого файла архива и назначьте его на «DIRLIB»

    DIRLIB : = ../library

  • затем связующая командование Makefile становится

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

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

Смежные вопросы