Как объединить две статические библиотеки " ar " в одну
у меня есть 2 статические библиотеки linux, созданные ar cr
,libabc.a
и libxyz.a
.
Я хочу объединить их в одну статическую библиотеку libaz.a
.
Как я могу это сделать?
Я хочу создать объединенную статическую библиотеку, а не отдавать обе библиотеки в конечную ссылку приложений
3 ответа:
вы можете извлечь объект из обоих
.a
файлы и создать свой.a
файл с помощью извлеченного.o
s: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. Вы можете использовать сценарий МРТ (например, libaz.МРТ), такие как:
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. a Итак, вам нужно извлечь членов разных архивов в разные папки:
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. 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
таким образом, компоновщик будет обрабатывать все вещи для вас!