Xcode7中创建静态库

作者: Shelin | 来源:发表于2015-10-28 14:35 被阅读9367次


一、静态库和动态库的区别:

静态库和动态库是相对编译期和运行期的,静态库以 .a 和 .framework 形式存在,链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝;动态库以 .dylib 和 .framework 形式存在,链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存,一般只能由系统创建。

二、静态库简介:

1、静态库分为真机—Debug(调试)版本、真机—Release(发布)版本、模拟器—Debug版本、模拟器—Release版本;开发中一般都打包Release(发布)版本,将真机和模拟器版本合并,提供外界。

2、使用场景:在项目开发的过程中,例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节。

三、用Xcode7创建静态库

.a文件版本(以制作AFNetworking静态库为例)

1、新建项目,点击iOS—Framework&—Cocoa Touch Static Library。

给你的工程命名为StaticLib

2、系统自动生成以工程名命名的.h和.m文件,可自定义的在目录下添加或删除文件,注意目录下Products文件夹有一个.a文件为红色,说明文件并不存在。这里我们将系统生成的.h和.m文件删除。

将AFNetworking的所有文件导入工程目录下

3、点击Build Phases—Copy Files,左下角点击+号按钮,添加你需要暴露的接口头文件。如果你在静态库工程中使用了category,那么你可能会碰到链接问题,解决的办法就是需要同时在生成静态库的工程和使用静态库的工程中使用“-all_load”编译选项,即在对应target的"Build Settings"中的“Other Linker Flags”选项添加“-all_load”,注意:使用静态库的工程中是一定要加该编译选项的!至于生成静态库的工程中加不加没有试过,不过建议还是加上该编译选项。

点击Add添加

4、然后点击左上角,选择Edit Scheme,Build Configuration下选择Release,先注意检查下面Release是否为NO:Yes表示只编译选中模拟器设备对应的架构,No则为编译所有模拟器设备支持的cup架构(Debug版本同理),选择NO,然后分别在模拟器和真机下Command+B编译一下,会看到Products文件夹下的.a文件变为黑色,这个.a文件就是我们想要得到的静态库,这里会出现一个问题你先编译的模拟器会发现.a依然是红色,你需要模拟器和真机都编译后.a才会变成黑色,这应该是Xcode本身的问题。

注:关于静态库对CPU架构的支持,首先了解iOS设备CPU架构方面的知识,ARM是微处理器行业的一家知名企业,arm处理器以体积小和高性能的优势在嵌入式设备中广泛使用,几乎所有手机都是使用它的。

模拟器:iphone4s~5 : i386 iphone5s~6plus : x86_64

真机:iphone3gs~4s : armv7  iphone5~5c : armv7s (静态库只要支持了armv7,就可以跑在armv7s的架构上) iphone5s~6plus : arm64

armv6, armv7, armv7s是ARM CPU的不同指令集,原则是向下兼容的。例如iPhone4S CPU支持armv7, 但它同时兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。

这里再补充一下查看静态库.a对处理器架构的支持,先cd到.a文件的路径下,命令行输入:lipo -info xxxxx.a

5、通过终端打开路径/Users/shelin/Library/Developer/Xcode/DerivedData/,选择对应的工程文件夹。

打开Build—Products文件夹,会看到Release-iphoneos和Release-iphonesimulator文件夹,分别是真机和模拟器的.a文件,为了使用方便我们将两个版本的.a文件合并。

6、合并真机和模拟器.a文件,在终端输入以下命令行:lipo -create  模拟器.a文件的路径 真机.a文件的路径 -output 合并后的保存路径(例:lipo -create /Users/shelin/Library/Developer/Xcode/DerivedData/StaticLib/Build/Products/Release-iphoneos/libxxx.a  /Users/shelin/Library/Developer/Xcode/DerivedData/StaticLib/Build/Products/Release-iphonesimulator/libxxx.a  -output /Users/shelin/Desktop/StaticLib.a)最终会在桌面得到一个合并后的StaticLib.a文件,再将暴露出来的.h头文件一起复制出来。

7、使用:只需将.a和暴露出来的.h头文件导入工程目录下就可供外界使用。

.framework版本:

待补充......

相关文章

  • Xcode7中创建静态库

    一、静态库和动态库的区别: 静态库和动态库是相对编译期和运行期的,静态库以 .a 和 .framework 形式存...

  • 收集的博客地址

    iOS及Mac开源项目和学习资料【超级全面】 Xcode7中创建静态库 深入理解RunLoop Coffee Pi...

  • iOS创建并使用自定义静态库和动态库

    一、创建一个静态库或动态库 1、创建一个静态库、动态库步骤: 静态库:创建一个新的项目,选择方框中的静态库,然后N...

  • 静态库

    目录 静态库 静态库的创建 静态库的使用 一、静态库的创建 方式一(.a): 1、创建project ,new p...

  • 使用XCode7打包动态库/静态库

    使用XCode7打包动态库/静态库 @(▶开发)[iOS,Xcode]文章同步在个人主页~ [TOC] iOS中的...

  • iOS 创建静态库(.framework)

    静态库(.framework) 文章类型: 学习笔记 关于静态库的简介说明请看iOS 创建静态库(.a) 创建一个...

  • iOS创建静态库

    一、创建.a静态库 新建一个静态库项目,如下图。新建静态库项目.png 在静态库中想要公开头文件给其他人使用,可以...

  • Xcode创建兼容多架构的合成库

    1.创建静态库 1.1 选择CocoaTouchStaticLibrary创建静态库 1.2 Command+B编...

  • 使用g++创建动态库和静态库及其相关探索

    使用g++创建动态库和静态库及其相关探索目录使用g++创建动态库和静态库及其相关探索0.前期准备1.静态库创建及链...

  • iOS 中静态库的创建

    本文主要说明.framework的创建与使用 iOS 中静态库简单介绍 1、iOS 中静态库的形式可以分为.a 和...

网友评论

  • 山重水复疑无路:班长你好,
  • windyfat:楼主,你好,我创建了一个.a文件,用lipo -info查看,是支持armv7和arm64的。但是我把文件导入工程,在5s上运行,是报错的,提示:Undefined symbols for architecture arm64。这是什么情况?
  • c33f9c00f1f8:楼主,请问如果我的framework中已经包括了类似AFNetwork这样的第三方库,给别人用后,如果他的project中也引用了AF,此时会不会冲突,如果冲突,该怎么解决啊
  • 流年忆时光:有个问题 xcode7.2创建的静态库 copy files 它和以前的 project public private有什么不同啊 求告知
    Shelin:@Sun123 http://www.cocoachina.com/ios/20150127/11022.html你可以参考下这个,希望对你有用
  • First灬DKS:楼主:你的静态文件写的很详细,想看你的framework的生成方法,你有写吗?
    Shelin:@First灬DKS 🙈偷懒了,一直没总结
  • 简单Timor:您好 我想将一单独的工程打包成静态库嵌入另一工程里面 需要打包些什么东些进去 如:appdelegate 、 Supporting Files 这些东西 需不需要放进去 楼主 求解答一下 谢谢
    c33f9c00f1f8:@ios_ZQ app delegate不能放进去的
  • 叁號選手:我按照你的步骤去做发现一个问题 我将两个文件路径 拼接一起的时候会报错!fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: /Users/apple/Library/Developer/Xcode/DerivedData/LissLib-aqbztubgncdxcvbpzjuzivoutytv/Build/Products/Debug-iphonesimulator/libLissLib.a and /Users/apple/Library/Developer/Xcode/DerivedData/LissLib-aqbztubgncdxcvbpzjuzivoutytv/Build/Products/Release-iphonesimulator/libLissLib.a have the same architectures (x86_64) and can't be in the same fat output file
    这个请问怎么解决?谢谢! :pray: 我单独将Release里面的.a文件弄出来只有一个.a文件了!求帮忙啊!
  • 半纸渊:按照这个方法试了一下,文件还是红色的!
    搞了很久,发现Xcode7.2要真机和模拟器都要编译成功后才能变成黑色,想死的心都有了。
    Shelin:@huangwenfei 这算一个坑,其实已经存在了,xcode不显示
  • 3d7204320882:请教博主,如果我要制作的静态库里包含另外一个静态库,实现的细节和制作不包含其他静态库的方法有区别么?
    比如需要制作一个静态路a,里面包含一个静态库b,b暴露的头文件是否需要在制作a的时候也添加到a的Copy Files中?
    c33f9c00f1f8:@ATM09ST 需要的
    0f28453ee046:层主,你测试了吗,我测试总是出错,你测试结果怎样?
    Shelin:@ATM09ST 我也没实践过你说的这种,但我觉得是需要把b的头文件暴露出来,可以测试一下
  • 49a31cd1ae90:自己写了一个库。调用了opencv2.4.10。合成的.A导入新的ios工程报错。
    “某函数” referenced from: -[ViewController viewDidLoad] in ViewController.o
    ld: symbol(s) not found for architecture armv7

    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    求指导
  • 改变自己_now:装逼必会!!!赞一个?
  • 一个人在路上走下去:有个问题,xcode7.1 下模拟器静态库文件无法生成
    8b504d60cac8:这个是怎么解决的,我也遇到了同样的问题
    一个人在路上走下去:@shelin 已经解决了,谢谢了。
    Shelin:@吴白 可以的,我这个用的就是Xcode7.1
  • 75feb661a58d:写的不错。谢谢

本文标题:Xcode7中创建静态库

本文链接:https://www.haomeiwen.com/subject/oqgxhttx.html