1. 使用命令 lipo -info 静态库名称 可以查看当前静态库支持的架构
2.#合并.a
lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a
3. -ObjC
打包.a当.a中包含category的时候 编译没问题但是运行的时候就会报 下图的错误
这个时候只需要在Other Linker Flags里面加入-ObjC标志就可以避免这个错误,这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大(因为加载了其他的objc代码进来)。但是如果静态库中有类和category的话只有加入这个flag才行。
4.-all_load
这个flag是专门处理-ObjC的一个Bug.用来-ObjC以后,如果类库中只有category没有类的时候,这些category还是加载不进来(这句有点不懂,我打包了个.a只包含UIView+Name 使用-ObjC可以加载出来,去除-ObjC只添加-all_load也可以加载出来,使用-force_load 静态库的路径同样可以加载出来,莫非是因为工程中只有这个.a的缘故?待后续测试).变通方法就是加入-all_load或者-force_load.-all_load会强制链接器把目标文件都加载进来,即使没有Objc代码,-force_load在xcode3.2后可用.但是-force_load后面必须跟一个静态库的路径
5 . 使用-ObjC 后,会产生两个问题 :
1.undefined symbols
2.duplicate symbols
undefined symbols 说明工程中没有引入第三方引用的库
如果不加-ObjC 参数,则在编译时不会出错,但在运行时用到了没有引用库的方法,则系统会崩溃这个问题好解决,只要找到缺的库,引入工程就可以了
duplicate symbols 的问题就不好解决了,说明第三方库中的类名和工程中的类名,或其他第三方库中的类名重名了.
最常见的比如Reachability 这个类.如果第三方库中引用了,自己的工程中也引用了.就会报duplicate symbols
如果引用的第三方库没有源代码,就只能将自己工程中的重名类重命名了
应对上面的问题,如果自己要制作一个库的话,要注意两点:
1.避免对系统类加category 这样,别人用到你的库时,不加ObjC参数也可以用你的库
2.如果库中用到了其它的第三方的源代码,尤其是用的比较普遍的,如 Reachability ,一定一定要对这些类重命名,最常见的做法是给类加个前缀,以避免别人用你的库时,产生duplicate symbols 的问题
链接地址:http://www.cnblogs.com/littleBit/p/4872600.html?utm_source=tuicool&utm_medium=referral