有时候,我们需要将一部分经常用到的代码提取出来用来复用,或者说需要用到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. EF(EntityFramework) Migrations 迁移

    1.开启程序包管理器控制台 2.安装EntityFramework PM> Install-Package EntityFramework   3.启用迁移 PM> Enable-Migr ...

  2. Excel累加上一行的数值

    默认一拖是每一行+1,现在想加任意: =A1+X 然后一拖就可以加X了.

  3. c#各类型转byte[]或转回

    var tmp = BitConverter.ToInt32(new byte[]{...}); var bytes = BitConverter.GetBytes(tmp); 而String转byt ...

  4. 匿名内部类 , Iterable<T> 和 Iterator<T>

    package generic; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; i ...

  5. Android图片二级缓存

    点击下载源代码 想起刚開始写代码的时候,领导叫我写一个头像下载的方法,当时屁颠屁颠就写了一个图片下载的,每次都要去网络上请求,最后直接被pass掉了 当时的思路是这种 后来渐渐地就知道了有二级缓存这东 ...

  6. 使用jquery dialog

    网页开发中,弹窗还是很有必要的.本人比较喜欢jquery ui的dialog. 但是jquery dialog中也有一些略显不方便的,如:没有z-index的参数设置,脚部的按钮样式没办法自定义…… ...

  7. Linux中如何设置服务自启动?

    转自:Linux中如何设置服务自启动? 有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务,主要用三种方式进行这一操作: ln -s             在/etc/rc.d/rc ...

  8. strncmp----c++库函数

    某天,蒜头君和花椰妹在公园里散步,走着走着,我的天!他们各自都捡到了一串漂亮的字符串,然而蒜头君好奇心比较重,他想知道自己的字符串在花椰妹的字符串中出现了多少次,例如花椰妹的字符串为abababa,蒜 ...

  9. linux学习笔记8--命令touch

    linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认 ...

  10. 上传图片时,使用JS获得图片文件大小

    这个方法用于获得图片文件的大小: 在FF,Chrome,IE6,IE7,IE8可用,不支持IE9+.(如果是IE9就需要flash插件了) var getSize = function(oFile,c ...