2018-05-28 15:20:07 BattleTiger 阅读数 482

在移动开发过程中,如果一个工程需要接入很多第三方sdk ,那么一个工程可能有好多个.a库。这么多个.a文件,能不能合成一个库,而又能同时实现多个功能呢?

这里,就用支付宝sdk和微信sdk用作试验。支付宝.a库:libcrypto.a     libssl.a    微信.a库 : libWeChatSDK.a

1.打开Launchpad->其他->终端;

2.从工程拖出上述三个.a文件,拖拽到桌面上,此时,它们的路径分别是:

/Users/ssiwo02/Desktop/libcrypto.a

/Users/ssiwo02/Desktop/libssl.a

/Users/ssiwo02/Desktop/libWeChatSDK.a

3.使用终端,查看上述三个.a库所支持的构架(i386,x86_64,armv7,armv7s,arm64,至于这些构架分别代表什么,可以看博主关于iOS 架构的博文,或自行百度)

在终端输入命令:  lipo -info /Users/ssiwo02/Desktop/libcrypto.a

显示: Architectures in the fat file: /Users/ssiwo02/Desktop/libcrypto.a are: armv7 armv7s i386 x86_64 arm64

同理 分别查看libssl.a    libWeChatSDK.a 支持的架构信息。

4.使用终端,分别分离出上述三个.a文件单独支持的架构版本,比如上述libcrypto.a支持armv7 armv7s i386 x86_64 arm64,那么就需要分离出单独支持armv7 armv7s i386 x86_64 arm64的libcrypto.a

在终端输入命令: lipo /Users/ssiwo02/Desktop/libcrypto.a -thin armv7 -output /Users/ssiwo02/Desktop/libcrypto_armv7.a

然后桌面上就出现一个单独支持armv7架构的.a库,命名为   libcrypto_armv7.a

同理分别分理libssl.a    libWeChatSDK.a 所支持的全部架构版本。

5.使用终端,分离出.a库的目标文件(.o)

在进行分离之前,因为.a库分离出来的目标文件.o文件很多,所以,最好在桌面上建立五个文件夹,命名为A,B,C,D,E,F   分别用来存储分离出来的支持armv7 armv7s i386 x86_64 arm64的.o文件。并进入当前的文件路径

在终端输入命令:cd /Users/ssiwo02/Desktop/A/

             ar -x /Users/ssiwo02/Desktop/libcrypto_armv7.a

             cd /Users/ssiwo02/Desktop/B/   (每次分离前,一定要更改当前的路径,否则分离出来的.o 文件都会在/Users/ssiwo02/Desktop/A/文件夹下)

             ar -x /Users/ssiwo02/Desktop/libcrypto_armv7s.a

这步操作比较多,容易出错

6.对支持同个架构的.o文件,进行合并成静态库。

在终端输入命令: libtool -static -o /Users/ssiwo02/Desktop/A/libXXXX-armv7.a *.o  

执行完毕,就会在/Users/ssiwo02/Desktop/A/路径中,生成一个linXXXXX-armv7.a 的文件。

同理分别对B,C,D,E,F的文件夹中的.o文件进行合并,并且命名。

如果不出错,就会得到5个.a文件:libXXXXX-armv7.a ,  libXXXXX-armv7s.a ,  libXXXXX-i386.a ,  libXXXXX-x86_64.a ,   libXXXXX-arm64.a

7.合成支持全部架构的通用静态库

在终端输入命令: lipo -create /Users/ssiwo02/Desktop/A/libXXXXX-armv7.a /Users/ssiwo02/Desktop/B/libXXXXXX-armv7s.a /Users/ssiwo02/Desktop/C/libXXXXXX-i386.a /Users/ssiwo02/Desktop/D/libXXXXXX-x86_64.a /Users/ssiwo02/Desktop/E/libXXXXXX- arm64.a -output /Users/ssiwo02/Desktop/libXXXXX.a

执行完毕,就会在桌面上生成一个命名为libXXXXX.a,这个libXXXXXX.a就是我们所需要的.a库。

2014-09-22 12:41:17 BenNiao110 阅读数 48

网上流传了太多关于合并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<br><br>输出是: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

 

接着用如下命令进一步分离出单独的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

  

2016-04-18 16:34:06 qq_26968709 阅读数 5821

在移动开发过程中,如果一个工程需要接入很多第三方sdk ,那么一个工程可能有好多个.a库。这么多个.a文件,能不能合成一个库,而又能同时实现多个功能呢?

这里,就用支付宝sdk和微信sdk用作试验。支付宝.a库:libcrypto.a     libssl.a    微信.a库 : libWeChatSDK.a

1.打开Launchpad->其他->终端;

2.从工程拖出上述三个.a文件,拖拽到桌面上,此时,它们的路径分别是:

/Users/ssiwo02/Desktop/libcrypto.a

/Users/ssiwo02/Desktop/libssl.a

/Users/ssiwo02/Desktop/libWeChatSDK.a

3.使用终端,查看上述三个.a库所支持的构架(i386,x86_64,armv7,armv7s,arm64,至于这些构架分别代表什么,可以看博主关于iOS 架构的博文,或自行百度)

在终端输入命令:  lipo -info /Users/ssiwo02/Desktop/libcrypto.a

显示: Architectures in the fat file: /Users/ssiwo02/Desktop/libcrypto.a are: armv7 armv7s i386 x86_64 arm64

同理 分别查看libssl.a    libWeChatSDK.a 支持的架构信息。

4.使用终端,分别分离出上述三个.a文件单独支持的架构版本,比如上述libcrypto.a支持armv7 armv7s i386 x86_64 arm64,那么就需要分离出单独支持armv7 armv7s i386 x86_64 arm64的libcrypto.a

在终端输入命令: lipo /Users/ssiwo02/Desktop/libcrypto.a -thin armv7 -output /Users/ssiwo02/Desktop/libcrypto_armv7.a

然后桌面上就出现一个单独支持armv7架构的.a库,命名为   libcrypto_armv7.a

同理分别分理libssl.a    libWeChatSDK.a 所支持的全部架构版本。

5.使用终端,分离出.a库的目标文件(.o)

在进行分离之前,因为.a库分离出来的目标文件.o文件很多,所以,最好在桌面上建立五个文件夹,命名为A,B,C,D,E,F   分别用来存储分离出来的支持armv7 armv7s i386 x86_64 arm64的.o文件。并进入当前的文件路径

在终端输入命令:cd /Users/ssiwo02/Desktop/A/

             ar -x /Users/ssiwo02/Desktop/libcrypto_armv7.a

             cd /Users/ssiwo02/Desktop/B/   (每次分离前,一定要更改当前的路径,否则分离出来的.o 文件都会在/Users/ssiwo02/Desktop/A/文件夹下)

             ar -x /Users/ssiwo02/Desktop/libcrypto_armv7s.a

这步操作比较多,容易出错

6.对支持同个架构的.o文件,进行合并成静态库。

在终端输入命令: libtool -static -o /Users/ssiwo02/Desktop/A/libXXXX-armv7.a *.o  

执行完毕,就会在/Users/ssiwo02/Desktop/A/路径中,生成一个linXXXXX-armv7.a 的文件。

同理分别对B,C,D,E,F的文件夹中的.o文件进行合并,并且命名。

如果不出错,就会得到5个.a文件:libXXXXX-armv7.a ,  libXXXXX-armv7s.a ,  libXXXXX-i386.a ,  libXXXXX-x86_64.a ,   libXXXXX-arm64.a

7.合成支持全部架构的通用静态库

在终端输入命令: lipo -create /Users/ssiwo02/Desktop/A/libXXXXX-armv7.a /Users/ssiwo02/Desktop/B/libXXXXXX-armv7s.a /Users/ssiwo02/Desktop/C/libXXXXXX-i386.a /Users/ssiwo02/Desktop/D/libXXXXXX-x86_64.a /Users/ssiwo02/Desktop/E/libXXXXXX- arm64.a -output /Users/ssiwo02/Desktop/libXXXXX.a

执行完毕,就会在桌面上生成一个命名为libXXXXX.a,这个libXXXXXX.a就是我们所需要的.a库。

2014-05-19 10:33:04 u014632601 阅读数 1071
lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a  -output SQY/iOS/libGamePus.a

其中SQY/iOS/iphoneos/libGamePlusAPI.a //为真机库。  

 SQY/iOS/iphonesimulator/libGamePlusAPI.a //为模拟器库
 -output SQY/iOS/libGamePus.a //为两个合并后存放的路径

然后可以输入命令测试下是否成功  

lipo -info SQY/iOS/libGamePus.a  //下面是输出 armv7 i386 有了两个就表情模拟器和真机都支持  其中armv7为真机架构 i386为模拟器
Architectures in the fat file: SQY/iOS/libGamePus.a are: armv7 i386

这二个库一个是用于真机运行的一个是用于模拟器运行的.其实我们可以利用lipo将这二个文件打包成一个通用的a文件。命令如下:

将/Users/user/Library/Developer/Xcode/DerivedData/UITab-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products替换成你的路径。

将/Users/user/Desktop/libPrint.a替换成合并后的路径。

lipo -create /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphonesimulator/libPrint.a  /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphoneos/libPrint.a  -output /Users/pjk1129/Desktop/libPrint.a
2016-03-01 17:58:27 liyun123gx 阅读数 3757

这里以移动广告平台多盟的三个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

 

接着用如下命令进一步分离出单独的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

  

(自己做的时候分离armv7s不成功,将armv7s改为arm64成功了。lipo libtest.a -thin arm64 -output libtest_arm64.a)

 原文地址:

IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)

 

没有更多推荐了,返回首页