iOS多个链接库冲突的解决办法(重复使用相同的开源代码)

转载 2015年07月10日 10:56:53

网上流传了太多关于合并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上。

1
lipo -info libDomobOfferWallSDK.a 输出是:Architectures in the fat file:libDomobOfferWallSDK.a are: armv7 armv7s i386
1
其他同理

看到红色粗体的fat了吗,fat file表示这个库里面合并了多于1个框架。

 

2.将lib库拆分出armv7、armv7s、i386类型的.a:

1
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库:

1
2
lipo -info libDomobOfferWallSDK_arm.a
打印出:Architectures in the fat file: libDomobOfferWallSDK_arm.a are: armv7 armv7s


arm64库的分解方式不同于extract_family 要用下面方式:

lipo libFB_MOBILE_SDK.a -thin arm64 -output ./arm64/libArm64.a

 


接着用如下命令进一步分离出单独的armv7、armv7s版本:(非常重要的步骤)

1
lipo libDomobOfferWallSDK_arm.a -thin armv7 -output libDomobOfferWallSDK_armv7_final.a
1
lipo libDomobOfferWallSDK_arm.a -thin armv7s -output libDomobOfferWallSDK_armv7s_final.a

而对于i386则不用上述那么麻烦,直接用第一句-extract_family指令就能分离出只含i386版本的库:

1
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文件

1
2
3
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文件中合并成静态库:

1
libtool -static -o ../libDomobUniversal-armv7.a *.o

armv7s、i386版本同理。

 

5.合并成最终的通用静态库:

1
lipo -create -output libDomobUniversal.a libDomobUniversal-i386.a libDomobUniversal-armv7.a libDomobUniversal-armv7s.a

  



 本人转载记录,来源:http://www.cnblogs.com/wengzilin/p/3800856.html

如何解决C程序中不同静态库之间的符号冲突问题

之前在将helix player移植到ios平台时遇到过这个问题,现在整理一下,给自己做个总结,也希望能对别人有所帮助。 问题的描述:  如果helix在ffmpeg之前是一个小有名气的开源的播放...
  • hp_truth
  • hp_truth
  • 2015年04月14日 16:23
  • 2061

打包framework之嵌套另一静态库产生类文件重复问题

最近在做将几个类封装成framework,以便其他的项目调用。  封装的类需要引用第三方静态库,但是将第三方静态库拖进项目中编译出来的静态库在其他项目中使用时遇到了一些问题。  因为其他项目中需要...
  • u011334685
  • u011334685
  • 2015年01月20日 11:06
  • 2978

关于Myeclipse使用mybatis出现Jar包冲突的解决办法

  • 2016年08月15日 16:53
  • 216KB
  • 下载

如何重复使用相同内容的脚注?

如何重复使用相同内容的脚注? 如果具有相同内容的脚注在文档中多次出现在不同地方,简单地重复输入脚注内容不是一个好办法。我 们可以通过半自动的方法来避免重复输入,或者对需要重复的脚注加上标签然后在其...
  • generalhking
  • generalhking
  • 2014年03月20日 15:19
  • 1572

IOS lib(.a)库冲突解决办法

在引入第三方lib(.a)库时,经常会由于第三方lib库中又引入同你现有工程相同的开源代码而造成.o冲突,最近在集成汉王名片识别时发生ASIHttp的.o冲突。我想说的是像这种开源的使用率很高的源代码...
  • LIN1986LIN
  • LIN1986LIN
  • 2015年04月17日 14:31
  • 1115

ios 静态库冲突的解决办法

ios 静态库冲突的解决办法
  • jacke121
  • jacke121
  • 2017年05月05日 16:49
  • 341

关于一台电脑上部署多个JBOSS,端口冲突解决办法

当一台电脑上需要部署多个JBOSS时候,会出现端口冲突的情况。修改以下3个配置文件的端口号即可   1、server\default\conf\jboss-service.xml下      ...
  • ChanningZhao
  • ChanningZhao
  • 2013年02月20日 11:31
  • 861

win7安装QT时出现"无法定位程序输入点_except1于动态链接库MSVCR120.dll"时的解决办法

这两天回老家了,没事打算在笔记本上装个QT,系统是新做的WIN7 64位,结果试了几个版本,死活装不上,总是出现如下错误: "无法定位程序输入点_except1于动态链接库MSVCR120.dll" ...
  • xiezhaoxuan
  • xiezhaoxuan
  • 2016年09月07日 16:48
  • 41511

MATLAB与C++混合编程:动态链接库方法实现混合编程及常见错误解决办法

动态链接库方式调用MATLAB写好的函数,
  • top_along
  • top_along
  • 2014年11月12日 15:02
  • 2128

Magento中使用jQuery与Prototype库冲突的解决办法

Magento内置使用的Prototype库,和jQuery的使用有一定的冲突,解决起来还是相当简单的。在网上有很多文章介绍这个东西,详细到说明了jquery和prototype库的引入前后顺序,最开...
  • ljguo212
  • ljguo212
  • 2012年05月22日 14:53
  • 619
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS多个链接库冲突的解决办法(重复使用相同的开源代码)
举报原因:
原因补充:

(最多只允许输入30个字)