本文共 1548 字,大约阅读时间需要 5 分钟。
简介
什么是库?
库是程序代码的集合,是共享程序代码的一种方式根据源代码的公开情况,库可以分为 2 种类型
开源库
公开源代码,能看到具体实现比如 SDWebImage 、 AFNetworking
闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现主要分为:静态库、动态库
静态库和动态库
静态库和动态库的存在形式
静态库: .a 和 .framework动态库: .dylib 和 .framework
静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中, 被多次使用就有多份冗余拷贝 (左图所示)动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
需要注意的是:
项目中如果使用了自制的动态库,不能被上传到 AppStore
1.创建Cocoa Touch Static Library
lipo -create /Users/bob/Desktop/liblibFrame_sim.a /Users/bob/Desktop/liblibFrame.a -output test.a
分别对应两个库路径,生成合并库路径
然后生成静态库成了
生成C++动态库
1.创建空的项目2.添加Target
生成一个Demo 用于调试自己的Framework
这是我生成的TestDemo 和FrameWork项目
生成workspace
打开.xcworkspace 文件 将两个项目的 .xcodeproj 拉进去
然后编辑相应文件
还有注意Other Linker Flags ,这个要理解明白
在用第三方库时,我们常常在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志,它和Objective-C的一个重要特性:类别(category)有关。根据这里的解释,Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现”selector not recognized”,也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。不要以为这样就可以解决所有问题了,在64位的Mac系统或者iOS系统下,链接器有一个bug,会导致只包含有类别的静态库无法使用-ObjC标志来加载文件。变通方法是使用-all_load 或者-force_load标志,它们的作用都是加载静态库中所有文件,不过all_load作用于所有的库,而-force_load后面必须要指定具体的文件他们加载的位置也是在Xcode的Build Settings下Other Linker Flags里面。
有时候还会遇到这个问题现在解决让接入用户共享我们库里面的第三方文件