静态库和动态库区别:
- 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
- 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
.a与.framework有什么区别
- .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
- .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用,建议用.framework。
.a + .h + sourceFile = .framework。
.a静态库的制作
我们直接创建调试项目,一般不直接创建静态库。因为需要打断点,等调试成功后再打包相应的静态库。
1.创建一个普通项目
创建项目,并且在项目中添加 static library,最终如下图所示。

2.设置可见的.h文件。
Build Phases --> Copy Files 添加.h文件即可。

3.修改支持的架构
设置支持所有模拟器架构 Build Settings --> Build Active Architecture Only --> Debug 改为 NO,设置支持所有手机架构。

4.然后编译
选中PrintTarget,然后分别选择Generic iOS Device和任意一个模拟器各编译一次,编译完后,我们会看到工程中Products文件夹下的libPrint.a由红色变成了黑色,然后show in finder,看看生成的文件。

5.将模拟器和真机的静态库合并
- 可以使用
lipo-info + 静态库名字命令查看静态库支持的框架。 - 如果想要让模拟器和真机通用一个静态库,我们可以使用终端命令来实现。命令格式:
lipo -create 第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径。
.framework静态库的制作
1.创建一个普通项目

2.修改打包的framework是动态库还是静态库
framework项目默认是动态库。
静态库配置:Build Settings --> Mach-O Type --> 改为 Static Library。
设置支持所有模拟器架构 Build Settings --> Build Active Architecture Only --> Debug 改为 NO,设置支持所有手机架构。
3.编写代码,设置可见头文件
编写完代码后,Build Phases --> Headers --> public 添加头文件。

4.然后编译
选中LibTestTarget,然后分别选择Generic iOS Device和任意一个模拟器各编译一次,编译完后,我们会看到工程中Products文件夹下的LibTest.framework由红色变成了黑色,然后show in finder,看看生成的文件。
5.将模拟器和真机的静态库合并
- 可以使用
lipo -info framework下的二进制文件名字命令查看静态库支持的框架。 - 如果想要让模拟器和真机通用一个静态库,我们可以使用终端命令来实现。合并的命令为:
lipo -create 第一个framework下二进制文件的绝对路径 第二个framework下二进制文件的绝对路径 -output 最终的二进制文件路径。
6.注意
注意:
如果静态库中有category类,则在使用静态库的项目配置中Other Linker Flags需要添加参数-ObjC或者-all_load。
完整Demo地址
github: github.com/CaoXueLiang…