Использование "ar" для объединения файлов .o и .a(Linux)

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

Ответы

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

Ex: 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. Тогда нет необходимости извлекать объектные файлы из отдельных архивов.

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

Ответ 3

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

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