Как объединить два «Ar» статических библиотек в один?

StackOverflow https://stackoverflow.com/questions/3821916

  •  26-09-2019
  •  | 
  •  

Вопрос

У меня есть 2 статических библиотеки Linux, созданные ar cr, libabc.a а также libxyz.a.
Я хочу объединить их в одну статическую библиотеку libaz.a.
Как я могу это сделать.

Я хочу создать объединенную статическую библиотеку, чтобы не дать обе библиотеки к окончательной ссылке приложений.

Это было полезно?

Решение

Вы можете извлечь объект с обоих .a файлы и создать свой .a Файл с использованием извлеченного .oS:

ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a  *.o

Другие советы

Есть как минимум три способа сделать это родом. Отказ Первый и самый портативный способ - использовать libtool. После создания других библиотек также с LibTool, вы можете объединить их, просто добавив .la libs на переменную Automake libaz_la_libadd или непосредственно из makefile с чем-то вроде:

libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la

Другие два, по крайней мере, доступны при использовании GNU AR. Вы можете использовать сценарий MRI (например, например, libaz.mri), например:

create libaz.a
addlib libabc.a
addlib libxyz.a
save
end

а затем выполнить AR как:

ar -M <libaz.mri

Или вы можете использовать тонкий Архив (опция -T), что позволит добавить другие архивы, не заставляя их вложить внутрь, хотя недостаток в том, что если вы хотите распределить статическую библиотеку, отдельный объект будет отсутствовать:

ar -rcT libaz.a libabc.a libxyz.a

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

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

mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz

Если вы просто делаете это как:

ar x a.a
ar x b.a
ar c c.a  *.o 

Вы потеряете некоторые объектные файлы, если есть участники с тем же именем как в AA, так и в BA, так что вам нужно извлечь элементы разных архивов в разную папку:

ar x a.a && mv *.o a_objs
ar x b.a && mv *.o b_objs
ar c c.a a_objs/*.o b_objs/*.o

Дальше больше, возможно, что есть несколько членов одинакового имени в одном архиве (скажем, в AA), если вы запустите AR X AA., вы получите только один для тех членов одинакового имени.

Единственный способ извлечения всех членов одинакового имени в одном архиве - указать номер участника по параметру 'N':

ar xN 1 a.a  xxx.c.o && mv xxx.c.o xxx.c.1.o
ar xN 2 b.a  xxx.c.o && mv xxx.c.o xxx.c.2.o
...

Это будет утомительная работа, поэтому вам придется написать более сложный скрипт, чтобы сделать эту работу.

Один необязательный Решения состоит в том, что вы можете объединить несколько архивов в одну общую библиотеку:

g++ -shared -o c.so -Wl,--whole-archive a.a b.a 

Таким образом, линкер будет обрабатывать все для вас!

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

Вы делаете частичные ссылки с

gcc -r --nostdlib

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

gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o

тогда

ar -cr $LIBNAME_JOINED.a $LIBNAME_A.o $LIBNAME_B.o
ar -x libx264.a
mkdir sub && cd sub
ar -m ../libx264.a `ar -t ../libx264.a |sort|uniq|grep "\.o"`
ar -x ../libx264.a

Теперь у вас есть две версии «Macroblock-10.O»

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top