Объединить статические библиотеки - PullRequest
40 голосов
/ 17 ноября 2011

Я попробовал подход в этом вопросе , но, похоже, версия ar для Linux не совпадает с версией для Mac, поскольку мне не удалось снова объединить объектные файлы.

Что я в основном хочу сделать, так это объединить другую статическую библиотеку с моим продуктом для сборки статической библиотеки XCode с помощью фазы сборки run-script.

К сожалению, я не могу скомпилировать другую библиотеку напрямую в свой проект, потому что она имеет собственную систему сборки (поэтому я использую скомпилированные библиотеки).

Я думаю, что должна быть возможность объединить другую библиотеку через ar с библиотекой, сгенерированной Xcode, без декомпиляции продукта сборки. Как мне это сделать?

Ответы [ 4 ]

71 голосов
/ 17 ноября 2011

вы можете использовать libtool, чтобы сделать это

libtool -static -o new.a old1.a old2.a
5 голосов
/ 01 декабря 2015

Если вы имеете дело со статическими библиотеками с несколькими архитектурами, вам потребуется немного дополнительных манипуляций, чтобы уменьшить толщину каждой библиотеки, объединить утонченные версии и затем сжечь результат. Вот удобный скрипт, который вы можете отредактировать по своему усмотрению, который делает все это в одном. В этом примере три библиотеки iOS path/to/source/libs/libone.a, path/to/source/libs/libtwo.a и path/to/source/libs/libthree.a объединяются в одну библиотеку libcombined.a.

.
#! /bin/bash

INPATH="path/to/source/libs"

LIBPREFIX="lib"
LIBS="one two three"
LIBEXT=".a"

OUT="combined"

ARCHS="armv7 armv7s arm64"

for arch in $ARCHS
do
  for lib in $LIBS
  do
    lipo -extract $arch $INPATH/$LIBPREFIX$lib$LIBEXT -o $LIBPREFIX$lib-$arch$LIBEXT
  done
  INLIBS=`eval echo $LIBPREFIX\{${LIBS// /,}\}-$arch$LIBEXT`
  libtool -static -o $LIBPREFIX$OUT-$arch$LIBEXT $INLIBS
  rm $INLIBS
done

OUTLIBS=`eval echo $LIBPREFIX$OUT-\{${ARCHS// /,}\}$LIBEXT`
lipo -create $OUTLIBS -o $LIBPREFIX$OUT$LIBEXT
rm $OUTLIBS
0 голосов
/ 17 ноября 2011

Вы должны использовать ar -r для создания архива на MacOS:

ar -x libabc.a
ar -x libxyz.a
ar -r libaz.a  *.o
0 голосов
/ 17 ноября 2011

Вы должны просто иметь возможность связать одно с другим. Так что ... просто используйте ld для объединения изображений.

...