iOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
2015-01-14 14:04
218 查看
网上流传了太多关于合并lib库的方法,自己也尝试过,但大多失败。有感于这种急于解决问题,经过百般尝试后依旧无果的无奈心情,小翁在这里用一个实例来完整阐述如何在mac中合并lib静态库。
这里以移动广告平台多盟的三个lib库为例子,之所以以此为例子,是因为我也遇到了库冲突的问题,所以才有了本文的内容。
本文的目标:合并libDomobOfferWallSDK.a、libDomobAdWallCoreSDK+UI.a、libDomobAdSDK.a
Let`s begin!
1.依次查看所有需要合并的lib库所支持的框架类型。i386表示支持iphone模拟器,armv6应用在iphone 3gs上,armv7应用在iphone4,armv7s应用在iphone4s以及iphone5,arm64应用在最新的iphone5s上。
输出是:
Architectures in the fat file:libDomobOfferWallSDK.a are: armv7 arm64 i386 x86_64
2.将lib库拆分出armv7、armv7s、i386类型的.a:
很多人会以为上面这条命令就可以一步到位分离出armv7版本,因为你显式地指出armv7了。但是,你错了。libDomobOfferWallSDK_arm.a仍旧是fat file,也就是里面含有了arm所有版本,这也是网上很多版本的教程错误的原因。如果误以为libDomobOfferWallSDK_arm.a只含armv7一个版本,则下一步的解.o操作就会失败,会提示"is a fat file"。小翁认为,最保险的做法是每次lib变化时都用lipo
-info查看一下。现在我们查看一下libDomobOfferWallSDK_arm.a库:
接着用如下命令进一步分离出单独的armv7、armv7s版本:(非常重要的步骤)
3.分离出目标文件(.o)
进行实质上的合并。xcode里提示duplicate symbol都是说***.o与***.o冲突。注意,只有非fat file,也就是只含有单种版本的lib库才能分离出.o文件
4.从.o文件中合并成静态库:
5.合并成最终的通用静态库:
这里以移动广告平台多盟的三个lib库为例子,之所以以此为例子,是因为我也遇到了库冲突的问题,所以才有了本文的内容。
本文的目标:合并libDomobOfferWallSDK.a、libDomobAdWallCoreSDK+UI.a、libDomobAdSDK.a
Let`s begin!
1.依次查看所有需要合并的lib库所支持的框架类型。i386表示支持iphone模拟器,armv6应用在iphone 3gs上,armv7应用在iphone4,armv7s应用在iphone4s以及iphone5,arm64应用在最新的iphone5s上。
lipo -info libDomobOfferWallSDK.a
输出是:
Architectures in the fat file:libDomobOfferWallSDK.a are: armv7 arm64 i386 x86_64
2.将lib库拆分出armv7、armv7s、i386类型的.a:
lipo -extract_family armv7 -output libDomobOfferWallSDK_arm.a libDomobOfferWallSDK.a
很多人会以为上面这条命令就可以一步到位分离出armv7版本,因为你显式地指出armv7了。但是,你错了。libDomobOfferWallSDK_arm.a仍旧是fat file,也就是里面含有了arm所有版本,这也是网上很多版本的教程错误的原因。如果误以为libDomobOfferWallSDK_arm.a只含armv7一个版本,则下一步的解.o操作就会失败,会提示"is a fat file"。小翁认为,最保险的做法是每次lib变化时都用lipo
-info查看一下。现在我们查看一下libDomobOfferWallSDK_arm.a库:
lipo -info libDomobOfferWallSDK_arm.a输出:Architectures in the fat file: libDomobOfferWallSDK_arm.a are: armv7 armv7s
接着用如下命令进一步分离出单独的armv7、armv7s版本:(非常重要的步骤)
lipo libDomobOfferWallSDK_arm.a -thin armv7 -output libDomobOfferWallSDK_armv7_final.a lipo libDomobOfferWallSDK_arm.a -thin armv7s -output libDomobOfferWallSDK_armv7s_final.a而对于i386则不用上述那么麻烦,直接用第一句-extract_family指令就能分离出只含i386版本的库:
lipo -extract_family i386 -output libDomobOfferWallSDK_i386.a libDomobOfferWallSDK.a经过上面操作后,我们得到了第一个待合并库libDomobOfferWallSDK.a 的armv7、armv7s、i386三个版本的库。剩下的两个待合并库同理。
3.分离出目标文件(.o)
进行实质上的合并。xcode里提示duplicate symbol都是说***.o与***.o冲突。注意,只有非fat file,也就是只含有单种版本的lib库才能分离出.o文件
ar -x ../libDomobOfferWallSDK_armv7_final.a ar -x ../libDomobAdWallCoreSDK+UI_armv7_final.a ar -x ../libDomobAdSDK_armv7_final.a这一步最好是在lib*_final.a的同级目录下新建一个文件夹,专门用来接收解压出来的.o文件。同种版本(如armv7)的都解压到这个文件夹中,相同的.o文件他会自己覆盖掉。
4.从.o文件中合并成静态库:
libtool -static -o ../libDomobUniversal-armv7.a *.oarmv7s、i386版本同理。
5.合并成最终的通用静态库:
lipo -create -output libDomobUniversal.a libDomobUniversal-i386.a libDomobUniversal-armv7.a libDomobUniversal-armv7s.a
相关文章推荐
- IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
- IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
- 【原】IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
- 【原】IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
- IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
- [转载]IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
- IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)
- warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;使用 /NODEFAULTLIB:library问题解决方法
- Git 合并时冲突 Merge Conflict:file still marked as conflicted 解决方法
- LIBCMTD.lib与libcpmtd冲突的解决方法。
- iOS UIScrollview 和侧滑手势冲突解决方法
- ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)”的方法
- LIBCMTD.lib与libcpmtd冲突的解决方法。
- win7虚拟机iOS坑爹法语键盘冲突解决方法
- E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)解决方法
- IOS 子视图touch,父视图Ges手势冲突问题解决方法
- merge合并冲突具体解决方法
- ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)”的方法
- ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)”的方法
- egit的merge合并冲突解决方法