У меня есть папка «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
ответ
Вы путаете объектные файлы со статическими библиотеками. Объектный файл не является статической библиотекой, а 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
Этот как вы должны использовать набор ресурсов объектного файла, из которых потребуются разные подмножества для связи с различными программами: вы помещаете их в библиотеку и связываете библиотеку.
- 1. «Неопределенная ссылка на« Ошибка при связывании объектных файлов
- 2. GCC Слияние два Дифференц объектных файлов в один объектный файл
- 3. Ссылка на несколько объектных файлов C, содержащих функции с эквивалентной сигнатурой
- 4. Ссылка на gcc, g ++ и gfortran
- 5. Компиляция с gfortran: неопределенная ссылка на iargc_
- 6. gfortran LAPACK ошибка "неопределенная ссылка"
- 7. Makefile - перемещение объектных файлов
- 8. Структура объектных файлов
- 9. Ссылка dlls dts на несколько исполняемых файлов
- 10. Преимущество библиотек над объектных файлов
- 11. Восстановить PBL из объектных файлов
- 12. Как связать два объектных файлов
- 13. Связывание объектных файлов разных типов
- 14. LDAP несколько структурных объектных классов
- 15. Ссылка OSX Homebrew Gfortran против libC++
- 16. Ссылка на ошибку при использовании ld для связывания трех объектных файлов в двоичном формате
- 17. Использование объектных файлов linux в Windows
- 18. Ссылка Несколько файлов в том же schema.ini
- 19. Wordpress, устанавливающий несколько объектных условий
- 20. Огромный форт. # Файлов при запуске gfortran
- 21. Сохранение объектных файлов в каталоге сборки (Makefile)
- 22. Как определить расположение объектных файлов в GCC?
- 23. Связывание объектных файлов, в том числе избыточное?
- 24. Загрузка нескольких объектных файлов C в GHCi
- 25. Порядок объектных файлов в статической библиотеке
- 26. Ссылка на несколько файлов .MD в Stash, как?
- 27. Mix GFortran/MSVC при компоновке: неопределенная ссылка на _chkstk
- 28. Gfortran и Неопределенная ссылка на '__ [имя_компьютера] _MOD_ [имя_функции]'
- 29. Ссылка на два объектных файла с использованием gcc
- 30. Ссылка на статическую библиотеку, состоящую из нескольких библиотек и объектных файлов с использованием одного файла заголовка
Удивительный! Вы точно описали, что мне нужно. Не знаю, почему я пропустил идею организовать все объектные файлы в статическую библиотеку lib. Большое спасибо! – iMisanthrope
И еще одна вещь) Что делать, если мне нужно внести временные изменения в одну подпрограмму в статическом lib? Например, у меня есть подпрограмма ** CALC **, в 'calc.o'. Я упаковываю 'calc.o' со многими другими файлами' .o' в статический lib. Но во время разработки мне нужно добавить некоторые временные изменения в 'calc.o'. Если я собрал 'MainProgram.for' и' calc.for' и скомпилировал и связал их с lib, компоновщик скажет, что я дублировал ссылку для ** CALC **. Можно ли рассказать компоновщику, что если он уже нашел подпрограмму в объектном файле, то он не должен связывать его с lib? – iMisanthrope
Вам просто нужно поставить свою специализированную версию 'calc.o' ранее в этой ссылке, чем статическая библиотека. Как я уже объяснял, компоновщик будет извлекать и связывать объектный файл из статической библиотеки, только если этот объектный файл содержит определения некоторых символов, которые остаются неопределенными в этой точке связи. Если ваш 'calc.o' определяет все те же символы, что и версия библиотеки, то если ваш' calc.o' связан сначала, версия библиотеки игнорируется. –