今天介绍下,如何利用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. datetime与smalldatetime之间的区别

    1.一直以为smalldatetime和datetime的差别只是在于时间范围: smalldatetime的有效时间范围1900/1/1~2079/6/6datetime的有效时间范围1753/1/ ...

  2. Unity3D脚本18:可视化辅助设置类 Gizmos

    Gizmos   类 Gizmos用于场景中给出一个可视化的调试或辅助设置. 所有的Gizmos绘制都必须在脚本的OnDrawGizmos或OnDrawGizmosSelected函数中完成. OnD ...

  3. slice、substring和substr

    首先,他们都接收两个参数,slice和substring接收的是起始位置和结束位置(不包括结束位置),而substr接收的则是起始位置和所要返回的字符串长度.直接看下面例子: 1    var tes ...

  4. 看看 JDK 8 给我们带来什么(转)

    世界正在缓慢而稳步的改变.这次改变给我们带来了一个新模样的JDK7,java社区也在一直期盼着在JDK8,也许是JDK9中出现一些其他的改进.JDK8的改进目标是填补JDK7实现中的一些空白——部分计 ...

  5. meta标签的用法

    meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta 标签的用处很多.meta 的属性有两种:name和 ...

  6. Odoo ir value 分析

    源代码位置:openerp/addons/base/ir/ir_values.py _columns = { 'name': fields.char('Name', required=True), ' ...

  7. myeclipse10 .jsp将表单提交给.java(form网页与后台通信初识)

    做毕设需要用到form通信. 以下几张截图来自极课学院 servlet jsp文件 web配置 出现错误: 路径问题 仍然不对,需要再改 <form action="servlet/S ...

  8. $.each(),$.map()归纳

    //$.each()对字典(没有索引).数组(有索引) 遍历 //两个参数 var json={"name":"李可","age":&quo ...

  9. Apache Spark源码走读之7 -- Standalone部署方式分析

    欢迎转载,转载请注明出处,徽沪一郎. 楔子 在Spark源码走读系列之2中曾经提到Spark能以Standalone的方式来运行cluster,但没有对Application的提交与具体运行流程做详细 ...

  10. Apache Storm 衍生项目之2 -- Trident-ML

    欢迎转载,转载请注明出处,徽沪一郎,谢谢. 楔子 或许谈起storm是大数据实时计算框架已经让你不明觉厉,如果说storm还可以跟机器学习算法(ml)有机的结合在一起,是不是更加觉着高大尚呢.trid ...