Как объединить две статические библиотеки" ar " в одну

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

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

3 ответов


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

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

есть по крайней мере три способа сделать это изначально. Первый и самый портативный способ-использовать libtool. После создания других библиотек также с помощью libtool вы можете объединить их, просто добавив .La libs для автоматической переменной libaz_la_LIBADD или непосредственно из файла Makefile с чем-то вроде:

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

остальные два по крайней мере доступны при использовании GNU ar. Можно использовать сценарий МРТ (например, libaz.МРТ), такие as:

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 

вы потеряете некоторые объектные файлы, если в обоих a есть члены с одинаковым именем.a и b.а Итак, вам нужно извлечь членов разных архивов в разные папки:

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

более того, возможно, что в одном архиве есть несколько членов с одинаковым именем (скажем, в a.a), если вы бежите ar x a.а, вы получите только один для тех членов с тем же именем.

единственный способ извлечь все одноименные члены в одном архиве должны указать номер участника по опции '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 

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