XCode制作静态库过程中的问题

网上有很多关于xcode制作第三方库的教程,我就不再记录,这里说一说我在制作静态库中遇到的问题,以及解决办法。


问题一: 静态库.a文件始终为红色,显示编译不成功。


解决办法:这是xcode的一个bug,先将编译模式设置为device,编译成功,再切换回simulator模式即可编译simulator对应的.a文件,路径为

 /Users/${user_name}/Library/Developer/Xcode/DerivedData/${product_name} -aurdmbdevpxznmgvgvihwjqairej/Build/Products/Debug-iphonesimulator /libxxx.a
真机对应的.a文件在Debug-iphoneos /libxxx.a

问题二:静态库中使用了category扩展,引用静态库的工程找不到扩展的方法,报错

原因:这也是xcode的bug。。 Objective-C不会为每一个objc函数生成链接符号,而是会为每一个类生成链接符号。通过category对一个已有的类进行扩展,那么链接器就不知道如何把原代码与category的代码实现关联起来,导致生成的对象无法响应属于category的消息。


解决办法:1、build settings中的Other Linker Flags添加-Objc选项。这个选项会促使链接器加载库中所有定义了Class和Category的文件。但这些额外的代码会使目标文件变大。但在64位和iOS应用程序中,linker有一个bug,这个bug会导致objc选项无效,无法从静态库中加载只定义了Category的文件 ,这就需要添加-all_load或-force_load选项。


2、网上搜了一圈,说还有更好的办法解决,来自于Three20的源代码。解决办法如下:

  
  
/**
* Add this macro before each category implementation, so we don't have to use
* -all_load or -force_load to load object files from static libraries that only contain
* categories and no classes.
* See http://developer.apple.com/library/mac/#qa/qa2006/qa1490.html for more info.
*/
#define TT_FIX_CATEGORY_BUG(name) @interface TT_FIX_CATEGORY_BUG_##name @end \
@implementation TT_FIX_CATEGORY_BUG_##name @end
意思是定义一个空的class,使得包含该空class的文件能被加载,我试了试,仍然报错。。。只有先使用 -force_load了哭
摘自;http://blog.csdn.net/sclzcq/article/details/8330837






升级到Xcode4.5之后,新增了iPhone5的armv7s支持,但是去除了armv6的支持,也就是说用XCode4.5无论如何配置项目都是无法编译出能在iPhone3G、iTouch2上面运行的程序或者库文件的,
参见《 xcode4.5下编译出包含armv6架构的静态库 》:http://blog.yorkgu.me/2012/10/17/build-static-libs-for-armv6-with-xcode-4-5/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值