将多个静态库编译到单个iOS Framework中

Olo*_*iar 6 c iphone static-libraries ios libtool-xcode

我有一个很大的静态库,我想打包到iOS静态框架中以方便使用.该库实际上是几个.a文件,每个库的逻辑模块一个.

我有编制.a的设备(脂肪文件内置文件armv7,armv7s,arm64和模拟器(与FAT文件)i386,x86_64).

现在,AFAIK,我需要将所有这些文件组合成一个大文件,以便构建一个合适的框架.

使用这里描述的技术(组合静态库),我可以做:

libtool -static -o new.a old1.a old2.a
Run Code Online (Sandbox Code Playgroud)

但显然都old1.aold2.a包括相同的符号.因此,当链接到我的框架时,我得到链接器错误(出于正当理由)duplicate symbols.

一个更正确的方法(从而避免重复的符号)似乎是解压缩.o文件,并将它们组合成一个大.a文件(如何将多个库存档(.a)打包到一个存档文件中?)

ar x old1.a
ar x old2.a
ar rcs new.a *.o
Run Code Online (Sandbox Code Playgroud)

现在,记住,old1.a并且old2.a是胖文件,所以我需要将每个架构分开.

所以这就是我的工作:

lipo old1.a -thin armv7 -output armv7/old1.a
cd armv7; ar x old1.a; cd ..
...
lipo old1.a -thin x86_64 -output x86_64/old1.a
cd x86_64; ar x old1.a; cd ..

// Same goes for old2.a ...

// Then, 
libtool -static -o new.a armv7/*.o armv7s/*.o arm64/*.o // ... etc
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,当链接到这样创建的框架时,链接器找不到任何符号(即使nm它们全部显示).

知道如何构建静态框架吗?

Son*_*son 1

libtool 真的是在创建 fat 库吗?我们做了一些类似的事情,但是直接使用“lipo -create”

ar -r armv7.a a/armv7/*.o b/armv7/*.o c/armv7/*.o d/armv7/*.o e/armv7/*.o
ar -r armv7s.a a/armv7s/*.o b/armv7s/*.o c/armv7s/*.o d/armv7s/*.o e/armv7s/*.o
ar -r i386.a a/i386/*.o b/i386/*.o c/i386/*.o d/i386/*.o e/i386/*.o


$LIPO \
        -create \
        -arch armv7 "objs/armv7.a" \
        -arch i386  "objs/i386.a" \
        -o "$FRAMEWORK_INSTALL_NAME" \
    || abort "Lipo $1 failed"
Run Code Online (Sandbox Code Playgroud)

我们还遇到了一个问题,一个 isv 对我们的框架做了同样的事情,以制作他们的框架,所以即使 a/foo.o 和 b/foo.a 可以很好地进入我们的 armv7.o 。当他们提取 "ar -x" 时, ar 不会保留路径,因此只会写入一个 foo.o 。

我们通过在创建 target.a 之前重命名每个 .o 并给它一个前缀 a_foo.o 来修复它。