У меня есть два статических библиотеки Linux, созданные ar cr
, libabc.a
и libxyz.a
.
Я хочу объединить их в одну статическую библиотеку libaz.a
.
Как я могу это сделать.
Я хочу создать объединенную статическую библиотеку, а не отдавать обе библиотеки на финальную ссылку приложений.
linux
static-libraries
ar
osgx
источник
источник
libtool
libtool -static -o new.a old1.a old2.a
Ответы:
Вы можете извлечь объект из обоих
.a
файлов и создать свой.a
файл, используя извлеченные.o
s:источник
libabc.a
могут содержать объекты с одинаковыми именами (происходящие из разных каталогов) - тогда повторная сборка не сработает!ar -c
у меня не сработало (Ubuntu 14.04). Я получилar: no operation specified
. Я сделал это,ar -qc
и это сработало.Есть как минимум три способа сделать это изначально . Первый и самый переносимый способ - использовать libtool. После создания других библиотек также с помощью libtool вы можете объединить их, просто добавив .la libs в переменную automake libaz_la_LIBADD или непосредственно из Makefile с чем-то вроде:
Два других по крайней мере доступны при использовании GNU ar. Вы можете использовать сценарий MRI (например, с названием libaz.mri), например:
а затем выполните ar как:
Или вы можете использовать тонкий архив (опция
-T
), который позволит добавлять другие архивы, не вкладывая их внутрь, хотя обратная сторона заключается в том, что если вы хотите распространять статическую библиотеку, отдельный объект будет отсутствовать:Все вышеперечисленные методы корректно обрабатывают перекрывающиеся имена членов из исходных архивов.
В противном случае вам придется распаковать в разные каталоги и снова упаковать, чтобы избежать замены перекрывающихся имен членов:
источник
ar cqT libaz.a libabc.a libxyz.a && echo -e 'create libaz.a\naddlib libaz.a\nsave\nend' | ar -M
. Это создает временный тонкийlibaz.a
архив, а затем преобразует тонкий архив в обычный (чтобы его можно было перемещать / распространять). Это также изящно обрабатывает, когда в именах ваших библиотек есть специальные символы (пробелы, плюсы или запятые) (т.е.ar cqT libbundle.a libfoo++.a 'libbar baz.a'
). Но +1 от меня!libtool
я получаю эти ошибки:libtool: link: unable to infer tagged configuration libtool: error: specify a tag with '--tag'
Есть идеи, как это исправить?--Wl,-whole-archive
опция требуется в исходной команде связывания для нескольких lib * .a, и мне нужно объединить все библиотеки lib * .a вone.a
. При повторном связывании--Wl,-whole-archive
не будет работать сone.a
. Каково ваше предложение? stackoverflow.com/questions/56323197/…Если вы просто сделаете это как:
вы потеряете некоторые объектные файлы, если в aa и ba есть элементы с одинаковыми именами, поэтому вам необходимо извлечь элементы из разных архивов в другую папку:
более того, возможно, что в одном архиве есть несколько элементов с одинаковым именем (скажем, в aa), если вы запустите ar x aa , вы получите только один для этих элементов с тем же именем.
Единственный способ извлечь все элементы с одинаковыми именами в один архив - указать номер элемента с помощью опции 'N':
это будет утомительная работа, поэтому вам придется написать более сложный сценарий для выполнения этой работы.
Одно из дополнительных решений - вы можете объединить несколько архивов в одну общую библиотеку:
таким образом компоновщик сделает все за вас!
источник
-fPIC
.Еще лучше выполнить частичное связывание каждой библиотеки, и они сделают архив из двух результирующих объектных файлов. Таким образом, он работает как общие библиотеки.
Вы делаете частичное связывание с
поэтому либо вместо создания промежуточного архива, либо после его повторного извлечения запустите
тогда
источник
теперь у вас есть две версии "макроблока-10.o"
источник
Здесь вы создаете архив архивов, а затем «сглаживаете» (прореживаете) результат с помощью флажка T. Не уверен, как это будет работать с файлами .o с таким же именем, которые могут содержаться внутри.
источник