首先科普一下静态库的相关知识:
程序编译一般需经预处理、编译、汇编和链接几个步骤。对于我们项目中的一些公共代码,如果想要对其进行复用,可以把这些代码编译成一个静态库文件。在链接步骤中,链接器会从库文件中取得对应的代码并生成可执行文件。静态库的执行文件中包含了库中的完整代码,但是多次使用会产生多份冗余拷贝。
静态库和动态库的区别在于静态库在链接阶段被复制,与程序的运行阶段无关;动态库在程序运行时由系统动态加载到内存中供程序调用,这样可以大大节省内存。
以下场合可以考虑使用static library:
1、在保护源代码的基础上,共享代码。
2、减少编译的时间。
制作静态库的详细步骤如下:
1.在桌面建立一个文件夹,命名。
2.打开Xcode,通过菜单新建一个工作空间文件,注意要保存在之前的文件夹中。如下所示:
3、在工程导航区中右键,新建一个工程到该工作空间中:
注意选择如下模板
4.此时可以添加你的类。例如:
添加一个Category,例如:
5.打开Target的Build Settings,找到iOS Deployment Target,设置静态库支持的最低版本号:
然后打开Target的Build Phases,添加一个Copy Headers的Phase,用于生成向外公开的接口:
在新增加的Copy Headers的Project中增加上面的两个头文件,并将其拖到上面的Public部分中:
6.然后分别选择iOS Device和对应的iOS Simulator,各Build一次:
然后在下面的Products的libJuliaCore.a右键选择Show in Finder,打开后如下所示:
其中iphoneos文件夹中生成的是在真机设备上跑的库文件,iphonesimulator文件夹中生成的是在模拟器中跑的库文件,libJuliaCore.a就是Build出来的静态库文件,usr/local/include目录存放着对应的几个头文件,就是之前在Public中公开的头文件。
这时静态库已经创建成功。
接下来测试一下静态库文件中给出的接口。
首先把iphoneos和iphonesimulator中的libJuliaCore.a和两个头文件分别拷贝到某个路径。
1.在工作空间中右键,新建一个工程,这时选择普通程序模板,例如Single View Application。
创建完成后,工作空间目录如下:
2.接下来调用头文件中给出的接口,例如:
#import "ViewController.h"
#import "JuliaCore.h"
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[JuliaCore showLibraryDescription];
}
@end
3.Run
4.貌似成功了,但是别忘了还有个Category接口没有测试呢。测试代码:
#import "ViewController.h"
#import "JuliaCore.h"
#import "NSString+Test.h"
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// [JuliaCore showLibraryDescription];
NSString *str = @"String";
NSLog(@"%@", [str stringWithJCPrefix:str]);
}
@end
Run。。。Crash了。
解决方法:
选择运行程序的Target中的Build Settings,将Linking中的Other Link Flags设置为-all_load,如下:
5.跑真机,首先要复制iphoneos中的.a和.h文件,好麻烦的说,有没有方法简化呢?有!将iphoneos和iphonesimulator中的两个libJuliaCore.a文件合并,打开终端,输入下列命令:
$ lipo -create ./os/libJuliaCore.a ./simulator/libJuliaCore.a -output ./JuliaCore-Merge.a
前面两个路径是两个.a文件的路径,后面的路径是生成的.a文件路径,可以自定合并后的文件名。
(转载自http://www.myexception.cn/mobile/1590067.html)