今天介绍下,如何利用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”文件,添加方法体:

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

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    非常感谢博主的分享

Xcode 之自己编译静态库的更多相关文章

  1. 【iOS】编译静态库

    与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图s ...

  2. xcode 4 制作通用静态库

    参考:http://blog.csdn.net/pjk1129/article/details/7255163 最近在做Apple的IOS开发,有开发静态库的需求,本身IOS的开发,只允许静态库或者F ...

  3. 关于使用Visual编译静态库动态库及其使用的问题

    本文主要讲述了如何使用Visual Studio 2013 编译静态库和动态库,并使用. 一.静态库 1.  编写静态库 若要创建将引用并使用刚创建的静态库的应用程序,请从“文件”菜单中选择“新建”, ...

  4. android ndk-build 编译静态库libxx.a 以及Android studio openssl 静态库配置(cmake)

    android ndk-build 编译静态库libxx.a 需求场景: 目前有安卓编码好的现在的openssl的两个.a,我们需要调用openssl的函数,并把功能再封装成.a; 这样使用时,在an ...

  5. 【转】TI DSP C6657学习之——编译静态库.lib

    熟悉C++开发的的小伙伴都知道,我们一般代码中往往要引入许多第三方编译好的库,有些是静态链接库static library, 有些是动态链接库dll.引入库的目的一是减少代码的编译时间,二是只提供函数 ...

  6. Makefile 编译静态库文件及链接静态库

    本文为原创文章,转载需指明该文链接 1.代码目录结构如下: comm/ comm/inc/apue.h  3 atexit.c Makefile  5 staticlib/lib/ staticlib ...

  7. opencv编译静态库时选择MD模式无效的原因

    在Cmake-gui上看到的明明是MD运行库依赖,生成MS项目时却变成了MT运行库依赖. 原因在于编译静态库时内部做了自动替换.

  8. 编译静态库的方式使用spdlog和fmt

    前言 spdlog++库,而且支持header only方式,但header only的使用方式会造成编译时长增加,所以这里简单描述一下,其编译静态库的方式. 又因为spdlog还依赖另一个开源库fm ...

  9. Xcode 编译静态库

    有时候,我们需要将一部分经常用到的代码提取出来用来复用,或者说需要用到c++的代码的时候,可以通过编译成静态库的方式来使用.本文中使用的Xcode版本是8.3,静态库制作过程和其他版本基本一样,可能出 ...

随机推荐

  1. 找规律 SGU 126 Boxes

    题目地址:http://acm.sgu.ru/problem.php?contest=0&problem=126 /* 找规律,智商不够,看了题解 详细解释:http://blog.csdn. ...

  2. python 代码片段10

    #coding=utf-8 #元组是列表的近亲.列表用方括号,元组用小括号 #django配置文件大量用到元组 #注意,单个元素的元组要求在最后"必须"跟一个逗号. a=(&quo ...

  3. 浅谈MySQL索引背后的数据结构及算法

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  4. 关于求解不定方程的n(n-1)=2m(m-1)的解法的总结

    主要参考下面两篇论文 1.<不定方程x(x-1)=Dy(y-1)的解法> 2.<用递推公式求一个不定方程的正整数解> 原有题目意思是 记得有一次全班去唱K, 其中有个活动是情歌 ...

  5. 基于nginx tomcat redis分布式web应用的session共享配置

    一.前言 nginx 作为目前最流行的开源反向代理HTTP Server,用于实现资源缓存.web server负载均衡等功能,由于其轻量级.高性能.高可靠等特点在互联网项目中有着非常普遍的应用,相关 ...

  6. 使 SortList 实现重复键排序

    SortList 默认对按Key来排序,且Key值不能重复,但有时可能需要用有重复值的Key来排序,以下是实现方式: 1.对强类型:以float为例 #region 使SortList能对重复键排序 ...

  7. 20145302张薇《Java程序设计》实验三报告

    20145302张薇<Java程序设计>实验三:敏捷开发与XP实践 实验内容 使用git上传代码 使用git实现代码开发实践 实现代码的重载 使用git上传代码 git init git ...

  8. dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算(终结版)

    首先,说下概念(网上很多帖子几个地方都搞混了,理一下):   dip : device independent pixels ,设备无关像素. 我看很多帖子写的五花八门的,关于d的,什么display ...

  9. JBPM表达业务流程(流程定义语言)

    业务流程包括三部分: 活动 Activity / 节点 Node (有很多种,不同的类型有不同的功能,必须要有一个Start Activity) 连线 Transition / 转移 (从一个Acti ...

  10. POJ 3254 Corn Fields(状压DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13732   Accepted: 7216 Desc ...