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。
2,填写 Product Name , Organization Name, Company Identity, 然后next。
3,创建好项目后,目录结构如下所示:
4,打开“MyCommon.h”文件,添加一个静态方法:+(void)myPrint:(NSString *)text;
5, 打开“MyCommon.m”文件,添加方法体:
- +(void)myPrint:(NSString *)text
- {
- NSLog(@"myPrint:%@",text);
- }
6,保存,编译,到此,我们的静态库就制作成功了。如下图所示:
其中,要注意:图中红色1处,表示选中 IOS Device ,此时会生成 armv7、armv7s、arm64 架构的静态库;选中任一ios模拟器,则会生成i386架构下的静态库;图中红色2处,如果为红色,表示静态库尚未生成,如果为黑色,表示静态库生成成功。(ps:建议先选ios device 生成静态库,再选模拟器生成静态库)
7,在上图中红色2处,右键,“show in Finder”,打开文件夹,就会看到我们生成的静态库文件了。
8,现在生成的是Debug版本,如果想生成release版本的,可以在schema里编辑一下:菜单栏,Product - > Schema - > Edit Schema ,或者直接快捷键:command + < ,打开对话框,左边选择“Run”,右边 Build Configuration 中选择 Release ,ok.
重新编译运行一下,release版本就生成了。重新打开刚才的文件夹,就会看到了。
至此,我们的静态库就制作完毕了。下面介绍下如何使用:
二、静态库的使用
1,打开Xcode,create a new xcode project - 》 Empty Application,next。Product name:Test ,next,工程目录如下:
2,在Supporting Files 中新建 Group:MyLibs,引入我们刚才自己生成的.a静态库和.h 头文件。【注意:要使用iphonesimulator 文件夹下的静态库,即i386架构的,否则,在模拟器上会编译失败。】之后,在"AppDelegate.m"中引入“MyCommon.h”头文件,在application:didFinishLaunchingWithOptions 方法中添加 这么这行代码:
[MyCommon myPrint:@"hello world"];
如下图所示:
保存,编译,运行,就会看到图中4处红色部分:表示我们自己的静态库调用成功了。
3,如果在上一步中,我们使用了真机的.a静态库文件,当用模拟器编译运行工程时,会提示如下错误:
在错误信息中,我们也可以看到,找不到必需的i386架构的 libMyCommon.a 静态库文件。(相同的,如果使用真机测试,工程里却添加了模拟器使用的i386架构的静态库文件,也会报错,此时错误信息会诸如:missing required architecture armv7、armv7s 等)
三、教大家如何查看静态库的架构信息,以及如何合并模拟器和真机静态库。
1,首先打开Mac 终端,切换到静态库所在文件夹,输入如下命令:
lipo -info libMyCommon.a
回车,接着就会看到静态库的架构信息了,如图所示:
此时,我们可以知道,上图中使用的静态库是armv7等架构的,即是真机使用的静态库。
2,合并模拟器和真机静态库,在终端中输入命令:
lipo -create libMyCommon_iphone.a libMyCommon_simulate.a -output libMyCommon.a
,之后,在终端当前文件夹下,就会看到合并后的静态库文件 libMyCommon.a 了。
3,在刚才的测试工程中,换用我们刚刚生成的合并版本的静态库文件,这样,不管模拟器,还是真机,都可以直接调试运行了。
摘自:http://blog.csdn.net/jiajiayouba/article/details/38420517 非常感谢博主的分享