Использование «ar» для объединения файлов .o и .a (Linux) - PullRequest
16 голосов
/ 05 июня 2009

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

Ответы [ 3 ]

7 голосов
/ 05 июня 2009

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

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

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

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

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

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

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

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

1 голос
/ 23 сентября 2011

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

Пример: ar rc lib1.a obj1.o ar rc lib2.a obj2.o ar rc 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. Тогда нет необходимости извлекать объектные файлы из отдельных архивов.

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

0 голосов
/ 05 июня 2009

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

Также рассмотрим добавочную загрузку: ld -r

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...