Объединить статические библиотеки

Я попробовал подход в этом вопросе, но, похоже, версия 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 объединить изображения.

Другие вопросы по тегам