2015-07-27 4 views
0

У меня есть папка «library» с несколькими объектными (.o) файлами. Эти файлы содержат подпрограммы, которые не меняются от проекта к проекту. Каждый новый проект использует некоторые из этих объектных файлов, но не все из них.
Не могли бы вы рассказать мне, есть ли способ сообщить gfortran, чтобы найти эту папку для необходимых файлов .o?
Я пробовал варианты -I и -L, но никак. Когда я пишу имена .o напрямую, он работает:
gfortran main.for ./library/obj1.o ./library/obj2.o
, но у меня много файлов .o и пишут все их время траты. Я мог бы написать
, но тогда основная программа будет связана со всеми файлами .o, но для этого нужны только некоторые из них. Я надеялся, что что-то вроде
gfortran main.for -L./library/
будет работать, но это не так.
Я использую OS X с gcc версией 5.1.0. И я уверен, что должен использовать makefile для такого случая.Ссылка на несколько объектных файлов в gfortran

ответ

2

Вы путаете объектные файлы со статическими библиотеками. Объектный файл не является статической библиотекой, а gfortran-компоновщик - это просто системный компоновщик GNU, вызываемый gfortran - не будет рассматривать его как таковой. Вам нужна статическая библиотека, и вы пытаетесь использовать объектные файлы вместо нее.

Линкер распознает файл объекта с помощью расширения .o. Он распознает статическую библиотеку расширением .a и ожидает, что содержит файла .a , чтобы иметь форму статической библиотеки, а не формат объектного файла. (Так что вы не можете сделать объектный файл в статической библиотеке, просто переименовав его).

Линкер свяжет в вашу программу каждый файл объекта, который отображается на его , независимо от того, нужен он или нет. Он не ожидает, что вы укажете объектные файлы , если вы не хотите, чтобы они были связаны. Варианты компоновщика -L и -l для размещение библиотеки не имеют приложения к объектным файлам.

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

Когда компоновщик встречает статическую библиотеку в своей командной строке, он не связывает все содержимое библиотеки (если вы прямо не сообщите об этом). Он проверяет содержащиеся файлы объектов, чтобы определить, какие из них, если они есть, содержат определения для символов, которые еще не определены в этой точке в ссылке программы. Если какой-либо объектный файл в библиотеке обнаружил, что он предоставляет любые недостающих определений, то этот объектный файл извлекается из библиотеки и связан с программой. Объектные файлы в библиотеке, которые не содержат Отсутствующие определения не связаны. Библиотеки в командной строке последовательно проверяются таким образом, пока оба символа, на которые указывает программа , не имеют определений в связанных объектных файлах или библиотек больше нет.

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

Чтобы создать статическую библиотеку из объектных файлов, используйте инструмент ar. См. man ar.

Когда вы сделали вашу библиотеку, скажем, libsubs.a, и решил, что должен находиться в каком-нибудь каталоге, /path/to/subs, а затем связать его с программой, добавив

-L/path/to/subs -lsubs 

в командную строку, в которой ваш программа связана. Это приведет к компоновщику для поиска библиотеки под названием libsubs.a в каталоге /path/to/subs.

Так что, если вы компиляции и компоновки в одну стадию, использовать его как:

gfortran -o myprog myprog.f90 -L/path/to/subs -lsubs 

И если вы компиляции и компоновки в различных шагов, использовать его как:

gfortran -c -o myprog_1st_file.o myprog_1st_file.f90 
gfortran -c -o myprog_2nd_file.o myprog_2nd_file.f90 
gfortran -o myprog myprog_1st_file.o myprog_2nd_file.o -L/path/to/subs -lsubs 

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

+0

Удивительный! Вы точно описали, что мне нужно. Не знаю, почему я пропустил идею организовать все объектные файлы в статическую библиотеку lib. Большое спасибо! – iMisanthrope

+0

И еще одна вещь) Что делать, если мне нужно внести временные изменения в одну подпрограмму в статическом lib? Например, у меня есть подпрограмма ** CALC **, в 'calc.o'. Я упаковываю 'calc.o' со многими другими файлами' .o' в статический lib. Но во время разработки мне нужно добавить некоторые временные изменения в 'calc.o'. Если я собрал 'MainProgram.for' и' calc.for' и скомпилировал и связал их с lib, компоновщик скажет, что я дублировал ссылку для ** CALC **. Можно ли рассказать компоновщику, что если он уже нашел подпрограмму в объектном файле, то он не должен связывать его с lib? – iMisanthrope

+0

Вам просто нужно поставить свою специализированную версию 'calc.o' ранее в этой ссылке, чем статическая библиотека. Как я уже объяснял, компоновщик будет извлекать и связывать объектный файл из статической библиотеки, только если этот объектный файл содержит определения некоторых символов, которые остаются неопределенными в этой точке связи. Если ваш 'calc.o' определяет все те же символы, что и версия библиотеки, то если ваш' calc.o' связан сначала, версия библиотеки игнорируется. –

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