关于makefile里ARCH arm64与DEPLOYMENT 3.0冲突的问题

之前发帖求问过,但是没找到答案,今天有了一点结论,求指正

我的黑苹果上面是直接装的xcode 5.0,没有之前的版本。然后手动考入了iPhone5.1SDK和 iPhone6.1SDK,当配置里arm64 和 deplyment 3.0共存的时候,会报以下错误:

所以,创建工程的时候,我一般都得把配置改成deployment 6.0以上的才能编译通过:

今天开始学习rpetrich大大的AppList工程的时候,发现applist 的Makefile里面 arm64 跟 deployment3.0是并存的。

AppList_INSTALL_PATH = /System/Library/PreferenceBundles

TARGET_IPHONEOS_DEPLOYMENT_VERSION := 3.0

IPHONE_ARCHS = armv6 armv7 arm64

SDKVERSION_armv6 = 5.1
INCLUDE_SDKVERSION_armv6 = 7.0

然后在我这里苦逼的编译不过,折腾半天终于可以编译过了,最后的方案是取消arm64的选项,因为delpyment_version必须是3.0不然,SBApplication.h里就会有几个函数不被编译进来,在这个过程中我发先一个配置项:

THEOS_PLATFORM_SDK_ROOT_armv6 = /Applications/Xcode_Legacy.app/Contents/Developer

因为我的机器上只装了一个Xcode5.0,所有Xcode_Legacy.app是不存在的,这里会导致编译不过,我版Xcode_Legacy.app改成Xcode.app之后倒是编译正常了,因为我已经把5.1的sdk和6.1的sdk都复制到了当前的Xcode目录.

不过上面的配置项给了我个提示,是不是就是因为我们有装4.x版本的Xcode,导致arm64 跟3.0没法共存的?是不是编译3.0相关的程序是Xcode_Legacy.app里面才有的?

不知道我的猜想对不对?我打算去装一个4.x版的xcode,并且重命名成Xcode_Legacy.app试试

因为现在Apple已经采用clang作为编译器,而Xcode里支持clang的linker已经不再支持armv6架构,所以
虽然这里可以写deployment为3.0,但我不知道还能不能实际工作在iOS 3和4上。
DHowett版本的Theos是不能让arm64和3.0共存的,他推荐的是手动lipo成fat binary。但rpetrich的Theos fork是经过改造的,可以这么干,我没看过Theos源码,猜测rpetrich的fork原理就是用clang编译5.0+,用旧版Xcode里的gcc编译5.0-,然后给自动lipo到一起去。你可以看看Theos源码验证一下,我不肯定我的说法是正确的。
另外就是,为什么deployment target必须是3.0?SBApplication.h里的函数被不被编译进来,跟这个有什么关系?

deployment target 必须是3.0是,仅仅针对rpetrich的AppList这个应用来说的,我大致看了一下他的theos里面包含的SBApplication.h 里面的代码,找到了这个:

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_3_2
-(NSString*)pathForIcon;
-(NSString*)pathForSmallIcon;
-(id)spotlightIcons;
-(void)flushSnapshotsForAllRoles;
-(BOOL)isPrerenderedIcon;
-(void)_sendCurrentDeviceOrientation;
#endif

只有写deployment target 为3.0 这些函数才会被编译进取,不然主程序就会报错。。。。。主程序用了这几个函数,去没有用IPHONE_3_2去区别。。。。

额外在唠叨:看到rpetrich的theos 的include目录里包含的iphoneheaders大部分是2、3、4年以前的版本,不知道会不会照成影响。。