方法一:创建新工程
1、 新建一个工程,选择 ios 下 Framework & Library中的Cocoa Touch Static Library ,将工程命名为TestLibrary
2、可以看到,新建的Target里面同时具有TestLibrary.h、 TestLibrary.m 两个文件,可以直接在这里添加方法,也可以直接删除,然后换成自己需要打成静态库的.h、.m文件
3、编译前准备这里分release与debug版本,需要注意一下。我们的应用运行分为在模拟器上运行和在真机上运行,所以这里一定要注意版本一致,这里我做测试,所以就统一用debug
4、编译 选择设备为ios Deveice 编译一下,你会看到Products下libTestLibrary.a变为黑色了,这说明设备的静态文件已经生成,选择设备为iPhone Retina(3.5-inch) 再次编译一下,生成真机的静态文件
5、合成,将真机和设备的静态文件合成 在libTestLibrary.a上右键点击,选Show in Finder ,这时在Debug-iphoneos和Debug-iphonesimulator 文件夹下各有一个 libTestLibrary.a 文件,打开终端 输入
lipo -create /Users/macmini/Library/Developer/Xcode/DerivedData/TestLibrary-giuqdrzdcnfevqgbgvbbmgpkkusz/Build/Products/Debug-iphoneos/libTestLibrary.a /Users/macmini/Library/Developer/Xcode/DerivedData/TestLibrary-giuqdrzdcnfevqgbgvbbmgpkkusz/Build/Products/Debug-iphonesimulator/libTestLibrary.a -output /Users/macmini/Desktop/TestLib.a 并回车,这时我们就在桌面上生成了合成后的.a文件
其中/Users/macmini/Library/Developer/Xcode/DerivedData/TestLibrary-giuqdrzdcnfevqgbgvbbmgpkkusz/Build/Products/Debug-iphoneos/libTestLibrary.a 可以看出是真机.a文件的路径,(可直接将文件拖入终端即输入文件的路径了)/Users/macmini/Library/Developer/Xcode/DerivedData/TestLibrary-giuqdrzdcnfevqgbgvbbmgpkkusz/Build/Products/Debug-iphonesimulator/libTestLibrary.a,是模拟器.a文件的路径,/Users/macmini/Desktop/TestLib.a是合成新文件的路径,这里我把它放在了桌面
可以输入命令测试下是否成功 输入: -info /Users/macmini/Desktop/TestLib.a
反馈:Architectures in the fat file: /Users/macmini/Desktop/TestLib.a are: armv7 armv7s i386 arm64
有了armv7,i386两个就表示模拟器和真机都支持 其中armv7为真机架构 i386为模拟器
6、使用 将TestLibrary.h和刚生成的TestLib.a文件加进要使用的工程里,导入TestLibrary.h头文件后,就可以直接调用TestLibrary里写的方法了,在这里就完成了。
方法2:使用已有工程
1、选择File ---> New ---> Target 选择 ios 下 Framework & Library中的Cocoa Touch Static Library
2、TestLibrary.h、 TestLibrary.m 两个文件可以直接删掉,把你需要打成静态库的东西复制一份,放好,然后把你工程里的那一份.h .m 删除,然后把你刚才复制的那一份拖进工程,选择Targets里面的工程名和静态库名称,然后添加上,剩下的步骤和方法1一样
注意:1、一定要分清release与debug版本,你的项目是debug就生成并导入debug版的.a
2、如果你在静态库工程中使用了category,那么你可能会碰到链接问题,解决的办法就是需要同时在生成静态库的工程和使用静态库的工程中使用“-all_load”编译选项,即在对应target的"Build Settings"中的“Other Linker Flags”选项添加“-all_load”。 使用静态库的工程中是一定要加该编译选项的!!至于生成静态库的工程中加不加没有试过,不过建议还是加上该编译选项
3、为了使自己的静态库尽可能多的支持IOS的系统版本,应该在"IOS Deployment Target"这个选项中选择自己所需的IOS版本
4、 自动拷贝头文件 在工程对应的target的“Build Phases”下添加“Copy Headers”的选项。该选项默认是没有的,添加方法是点击下方的“Add Build Phase”按钮后选择后即可添加。该选项下有3个子选项,分别是Public,Private,Project。通过点击下方的加号,可以将工程中的头文件添加到“Project”中,在其中的对应头文件点击右键,选择“Move to Public Group”,当头文件移到“Pulic”后,编译工程以后,在工程编译后.a文件所在的路径下,会同时出现一个"usr/local/include"的文件夹,其中的头文件就是public group中的头文件。这时只需将.a文件和这个路径下的头文件拷贝到所需工程文件即可
5、静态库中不能包含资源文件(如文本、图片等),即使我们把资源文件拷贝到静态库工程中,但实际上是不会添加到target的,也就是说编译结果中并不包含这些资源,因此如果此时调用静态库,所有的资源都是缺失的。这时我们可以把资源建立成单独的束(Bundle)。新建工程 “OS X -> Framework & Library -> Bundle ”,命名为:LibraryBundle。然后把资源文件拷进Resouces中去。编译,就生成LibraryBundle.bundle文件。选择 Products 下LibraryBundle.bundle右击选Show in Finder,就找到了生成的bundle文件,使用时将其拖入即可
//bundle文件调用
#define MYBUNDLE_NAME @ "LibraryBundle.bundle"
#define MYBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME]
#define MYBUNDLE [NSBundle bundleWithPath: MYBUNDLE_PATH]
//函数getMyBundlePath可以取得束LibraryBundle中具体资源的绝对文件路径
NSString* getMyBundlePath( NSString * filename)
{
NSBundle * libBundle = MYBUNDLE;
if (libBundle && filename){
NSString * s=[[libBundleresourcePath ]stringByAppendingPathComponent : filename];
NSLog ( @"%@" ,s);
return s;
}
return nil ;
}