Объединить статические библиотеки
Я попробовал подход в этом вопросе, но, похоже, версия Linux ar
не совпадает с версией Mac, так как мне не удалось снова объединить объектные файлы.
Что я в основном хочу сделать, так это объединить другую статическую библиотеку с моим продуктом для сборки статической библиотеки XCode через этап сборки сценария запуска.
К сожалению, я не могу скомпилировать другую библиотеку непосредственно в свой проект, потому что она имеет собственную систему сборки (поэтому я использую скомпилированные библиотеки).
Я думаю, что должна быть возможность объединить другую библиотеку через ar
в сгенерированную библиотеку XCode без декомпиляции продукта сборки. Как мне это сделать?
4 ответа
Ты можешь использовать libtool
сделать это
libtool -static -o new.a old1.a old2.a
Если вы имеете дело со статичными библиотеками с несколькими архитектурами, вам понадобится немного дополнительных манипуляций, чтобы утончить каждую библиотеку, объединить утонченные версии и затем увеличить результат. Вот удобный скрипт, который вы можете отредактировать по своему усмотрению, который делает все это в одном. В примере используются три библиотеки 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
Вы должны использовать ar -r
создать архив на MacOS:
ar -x libabc.a
ar -x libxyz.a
ar -r libaz.a *.o
Вы должны просто иметь возможность связать одно с другим. Так что... просто используйте ld
объединить изображения.