Xcode 之自己编译静态库

时间:2023-03-08 17:37:24
Xcode 之自己编译静态库

今天介绍下,如何利用Xcode,新建一个静态库,以及如何编译成i386、armv7、armv7s 等平台架构。

开发环境:MAC OS X 10.9.4 + Xcode 5.0.2

背景知识:库分两种:静态库(.a、.lib) 和 动态库(.so、.dll),.a 和 .so 为linux平台下库后缀名,.lib 和 .dll 为windows平台下库后缀名。【对静态库和动态库不熟悉的,请参见博文:http://www.cnblogs.com/skynet/p/3372855.html 】。ios 开发,只允许使用.a静态库,不能像Android那样,可以使用.so 动态库,这也就是为什么网上的第三方组件,像百度、高德地图、新浪微博、友盟等sdk提供的都是一些.a 静态库文件 + 一些.h 头文件。i386架构下的静态库,是模拟器使用的;armv7、armv7s等是真机使用的静态库(注:i386架构下的静态库,在模拟器上运行正常,在真机上无法运行,编译会报错,两者不可混用,后面会详细介绍)。好了,废话不多说,下面步入正题:

一:新建静态库

1,打开Xcode,-》create a new xcode project  -》Framework & Library - > Cocoa Touch Static Library,next。Xcode 之自己编译静态库

2,填写 Product Name , Organization Name, Company Identity, 然后next。

Xcode 之自己编译静态库

3,创建好项目后,目录结构如下所示:

Xcode 之自己编译静态库

4,打开“MyCommon.h”文件,添加一个静态方法:+(void)myPrint:(NSString *)text;

5,  打开“MyCommon.m”文件,添加方法体:

  1. +(void)myPrint:(NSString *)text
  2. {
  3. NSLog(@"myPrint:%@",text);
  4. }

6,保存,编译,到此,我们的静态库就制作成功了。如下图所示:

Xcode 之自己编译静态库

其中,要注意:图中红色1处,表示选中 IOS Device ,此时会生成 armv7、armv7s、arm64 架构的静态库;选中任一ios模拟器,则会生成i386架构下的静态库;图中红色2处,如果为红色,表示静态库尚未生成,如果为黑色,表示静态库生成成功。(ps:建议先选ios device 生成静态库,再选模拟器生成静态库)

7,在上图中红色2处,右键,“show in Finder”,打开文件夹,就会看到我们生成的静态库文件了。

Xcode 之自己编译静态库

8,现在生成的是Debug版本,如果想生成release版本的,可以在schema里编辑一下:菜单栏,Product - > Schema - > Edit Schema ,或者直接快捷键:command + < ,打开对话框,左边选择“Run”,右边 Build Configuration 中选择 Release ,ok.

Xcode 之自己编译静态库

重新编译运行一下,release版本就生成了。重新打开刚才的文件夹,就会看到了。Xcode 之自己编译静态库

至此,我们的静态库就制作完毕了。下面介绍下如何使用:

二、静态库的使用

1,打开Xcode,create a new xcode project - 》 Empty Application,next。Product name:Test ,next,工程目录如下:

Xcode 之自己编译静态库

2,在Supporting Files 中新建 Group:MyLibs,引入我们刚才自己生成的.a静态库和.h 头文件。【注意:要使用iphonesimulator 文件夹下的静态库,即i386架构的,否则,在模拟器上会编译失败。】之后,在"AppDelegate.m"中引入“MyCommon.h”头文件,在application:didFinishLaunchingWithOptions 方法中添加 这么这行代码:

[MyCommon myPrint:@"hello world"];

如下图所示:

Xcode 之自己编译静态库

保存,编译,运行,就会看到图中4处红色部分:表示我们自己的静态库调用成功了。

3,如果在上一步中,我们使用了真机的.a静态库文件,当用模拟器编译运行工程时,会提示如下错误:

Xcode 之自己编译静态库

在错误信息中,我们也可以看到,找不到必需的i386架构的 libMyCommon.a 静态库文件。(相同的,如果使用真机测试,工程里却添加了模拟器使用的i386架构的静态库文件,也会报错,此时错误信息会诸如:missing required architecture armv7、armv7s 等)

三、教大家如何查看静态库的架构信息,以及如何合并模拟器和真机静态库。

1,首先打开Mac 终端,切换到静态库所在文件夹,输入如下命令:

lipo -info libMyCommon.a

回车,接着就会看到静态库的架构信息了,如图所示:

Xcode 之自己编译静态库

此时,我们可以知道,上图中使用的静态库是armv7等架构的,即是真机使用的静态库。

2,合并模拟器和真机静态库,在终端中输入命令:

lipo -create  libMyCommon_iphone.a  libMyCommon_simulate.a  -output  libMyCommon.a

,之后,在终端当前文件夹下,就会看到合并后的静态库文件 libMyCommon.a 了。

Xcode 之自己编译静态库

3,在刚才的测试工程中,换用我们刚刚生成的合并版本的静态库文件,这样,不管模拟器,还是真机,都可以直接调试运行了。

摘自:http://blog.csdn.net/jiajiayouba/article/details/38420517    非常感谢博主的分享