2009-06-04 9 views
15

Я пытаюсь создать единую статическую библиотеку, которая содержит объектные файлы и существующие статические библиотеки, которые были скомпилированы ранее в процессе сборки. Есть ли простой способ сделать это с помощью «ar», или мне нужно будет распаковать (ar x library_name) каждую библиотеку и добавить ее объектные файлы в мою унифицированную библиотеку?Использование «ar» для объединения файлов .o и .a (Linux)

+0

Возможный дубликат http: // stackoverflow.com/questions/386579/pack-shared-libraries-in-the-elf –

+0

Нет, не дубликат. Этот вопрос касается попытки пересоединения с разделяемыми библиотеками, в то время как этот вопрос касается статических библиотек и объектов, которые еще не связаны. – ephemient

+0

Если вы контролируете процесс сборки, этот шаблон выглядит как чистое решение: http://stackoverflow.com/a/4318960/78342 – Chinasaur

ответ

0

Вам нужно будет извлечь объектные файлы из других библиотек и объединить извлеченные файлы объектов в составную библиотеку.

считает также инкрементные загрузки: ld -r

7

Если вы хотите, чтобы создать общую библиотеку, которую Вы можете использовать это:

Вы можете использовать --whole-архив флага из ld:

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

Две ноты при использовании этой опции из gcc: во-первых, gcc не знает об этой опции, поэтому вам нужно использовать -Wl, -whole-archive. Во-вторых, не забудьте использовать -Wl, -no-whole-archive после списка архивов, потому что gcc добавит свой собственный список архивов к вашей ссылке, и вы можете не захотеть, чтобы этот флаг также повлиял на них.

Для статических библиотек вам, возможно, придется сначала извлечь объекты.

я нашел следующий для ar

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

Возможно, вы можете использовать тонкий архив .

+0

Опция тонкого архива (относительно) недавняя. Он недоступен в Fedora 8, например (п. 2.17.50). – neuro

+0

+1 кстати для интересного варианта (-все-архив), который только что спас мне жизнь! – neuro

1

Архивирование архивов всегда возможно. Я не тестировал, работает ли он, когда API-интерфейс вызывается из реализации.

Ex: ар гс lib1.a obj1.o ар гс lib2.a obj2.o ар гс lib3.a lib1.a lib2.a

you can check the contents of lib3.a by trying out. 

    ar x lib3.a which would extract lib1.a and lib2.a 

Но вам нужно построить вызова API от obj1.o и obj2.o. Тогда нет необходимости извлекать объектные файлы из отдельных архивов.

Надеюсь, это поможет!