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

  1.创建一个静态库工程。

  选择iOS->Cocoa Touch Static Library,如下图所示。

  创建完成后,工程中会出现两个文件.h和.m,文件名是你的工程名,将.h中的所有内容删除,将.m文件删除,如下图:

  2.导入依赖库和需要编译的文件。

  导入你的工程需要的依赖库,这个不用我说吧。在TARGETS->Build Phases->Link Binary中添加所需要的库即可。导入文件也不说了,记得勾选copy和group,直接在工程中创建也行啊。如下图是我导入的两个文件。

  在ThirdLib.h中添加你需要提供给外部的接口的头文件,然后在TARGETS->Build Phases中添加Headers,先点击一下空白处,然后在navigation上找到Editor,如下图。

  将需要暴露给外部的文件拖入相应的栏目下面,public、private、project,根据情况选择。我这里只想把ThirdLib.h暴露出来,所以只将ThirdLib.h拖入public中,如果想将某个类的接口细节,暴露也可以拖到public下面。如下图。

  还有另一种方法也可以,点击你需要暴露的文件,在Xcode的右边有个membership的选项,可以修改属性。

  3.其他配置

  找到target->build settings 搜索public,用如下图的方式替换。这样做,会在你编译之后出现一个叫include的文件夹在你的静态库中,里面包含了你暴露给外界的信息。

  到这一步,已经完成了一大半工作。接下来只需改几个地方即可进行编译。这几个地方的修改不必须的(不会对静态库造成太大的影响):

  Dead Code Stripping设置为NO,Strip Style设置为Non-Global Symbols,都是在target->build setting中找到并修改。一切都配置完后,选择build设备,如果选择模拟器,则会编译成只支持模拟器的静态库;如果选择真机,则会编译成只支持真机的静态库。先不管这些,将两种都生成出来,放在桌面两个不同的文件夹中,一个支持真机静态库,一个支持模拟器静态库。右键工程中product文件夹中的.a文件,show in finder。如下图是我编译出的两个静态库。

  然后在终端查看这两个静态库的信息,先进入文件夹,用命令,lipo -info libThirdLib.a查看,如下图。

  可以看到,它们支持的系统框架不同,模拟器是x86_64,真机是arm64,只能支持单一的目标肯定是不行的啊,不可能一直更换静态库吧。既然如此,我们需要把这两个静态库合并成一个。

  首先,将这两个库放在桌面两个不同的文件夹中,不这样也可以,主要是为了找绝对路径方便。然后使用命令 lipo -create 模拟器静态库的绝对路径 真机静态库的绝对路径 -output 静态库绝对路径。如下图。

  这样,在general中就会存在一个静态库thirdLib.a真机和模拟器都支持。

  到这里,静态库制作就完成了,很简单的过程,希望能帮到需要的小伙伴。下一篇,会讲framework,因为本人也不是很清楚,研究懂了之后会发表出来。再见~

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

  1. xcode编译静态库选择cpu架构

    此前编译了一个静态库,默认支持了armv7,armv7s,arm64 编译的话肯定是上面三个静态库分别编译出来,然后在把这三个合并成一个单独的库. 如果单个库的大小是10M,那编译总的库大概就30M了 ...

  2. Xcode 生成静态库相关设置:

    Xcode 生成静态库相关设置: #Build Setting1. Architectures ------- Architectures -----> $(ARCHS_STANDARD) -- ...

  3. xcode 制作静态库.a文件 详解

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

  4. 【iOS】编译静态库

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

  5. Xcode 创建静态库和动态库

    1.linux中静态库和动态库区别: 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库:这类库的名字一般是libxxx.a:利用静态函数库编译成的文件 ...

  6. iOS xcode创建静态库封装自己的SDK及使用

    https://www.cnblogs.com/JustForHappy/p/5773039.html 一,静态库和动态库的区别在这里就不说了,个人感觉如果是自己封装提供别人下载的话应该是静态库比较方 ...

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

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

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

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

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

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

随机推荐

  1. Nav titleView 设置的两个方式

    1.self.navigationItem.titleView = vv; 2.[self.navigationController.navigationBar addSubview:vv];

  2. HDU 3682 水模拟

    n*n*n的图形,m条线,每条线上的方格被删除.问一共删除了多少个方格 ans=m*n .然后推断一下直线相交的交点.去重就可以 #include "stdio.h" #inclu ...

  3. Atitit php序列化 php的serialize序列化和json序列化

    Atitit php序列化 php的serialize序列化和json序列化 PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP with ...

  4. Atitit.eclipse git使用

    Atitit.eclipse git使用 1. Git vs svn1 1.1. 直接记录快照,而非差异比较1 1.2. Git的patch则不依附于branch,commit和commit之间的关系 ...

  5. Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

    原文链接:Docker使用Dockerfile创建支持ssh服务自启动的容器镜像 1. 首先创建一个Dockerfile文件.文件内容例如以下 # 选择一个已有的os镜像作为基础 FROM cento ...

  6. js模块化规范AMD、CMD、CommonJS...

    1. AMD 1.1 什么是AMD? AMD 英文名 Asynchronous Module Definition ,中文名 异步模块定义 .这是一个浏览器模块化开发的规范. 由于浏览器环境执行环境的 ...

  7. url参数

    两个参数情况: String url="http://59.78.93.208:9097/Order?id="+id+"&value="+value; ...

  8. Hive学习笔记——保存select结果,Join,多重插入

    1. 保存select查询结果的几种方式: 1.将查询结果保存到一张新的hive表中 create table t_tmp as select * from t_p; 2.将查询结果保存到一张已经存在 ...

  9. 编写可维护的JavaScript----笔记(三)

    1.块语句花括号的使用 在JavaScript中,注入if和for语句有两种写法,使用花括号包裹的多行代码或者不使用花括号的单行代码.但强烈建议不论是单行还是多行代码,都应该使用花括号. 2.花括号的 ...

  10. jQuery设置和获取HTML、文本和值

    jQuery设置和获取HTML.文本和值 按 Ctrl+C 复制代码 <script type="text/javascript"> //<![CDATA[ $( ...