今天调试时前几次没什么问题,之后xcode莫名其妙出现了could not build module XXX的情况,有报foundation错的,也有报其它官方库错误的,甚至在只编译foundation的程序时也报错。网上查了下说有可能在command+单击查看官方头文件时不小心修改了头文件(例如多了一个空格、按了个冒号什么的),在历经:
1、clean工程
2、设置是否自动启用target中module功能
3、清空project的derived data文件夹
证明都无效!
最后无奈重装XCode5.1才最终解决。。。
(考虑原来本机装有XCode_4.3.3,是否原版本没卸载干净所致?但其它的project编译没问题)
最后证明以上都无效!!!
后来github上找到了一段代码可以omit掉该issue,这似乎是XCode5的bug。虽然忽略掉该库可以解决问题但可能会引起其他的需要用到该库的问题,但目前没遇到。
如下:
// When the `accessibility inspector' is enabled on the iOS Simulator the private `UIAccessibility'
// framework is loaded. In turn it will try to load a list of bundles amongst which is one that has
// only resources, no executable. This leads to `CFBundleLoadExecutableAndReturnError' logging this
// offending error message.
//
// This code omits the `SDK_ROOT/System/Library/AccessibilityBundles/CertUIFramework.axbundle'
// bundle from ever being attempted to load.
//
// This code is available under the MIT license: http://opensource.org/licenses/MIT
//
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <dlfcn.h>
#define ACCESSIBILITY_PATH @"/System/Library/PrivateFrameworks/UIAccessibility.framework"
#define APP_SUPPORT_PATH @"/System/Library/PrivateFrameworks/AppSupport.framework/AppSupport"
#define COPY_PREFS_NAME "CPCopySharedResourcesPreferencesDomainForDomain"
typedef CFStringRef (*CopyAppSupportPrefs)(CFStringRef);
@interface UIAccessibilityLoader : NSObject
// STFU compiler.
- (void)loadActualAccessibilityBundle:(NSBundle *)bundle
didLoad:(BOOL *)didLoad
loadSubbundles:(BOOL)loadSubbundles;
@end
@interface STFU_UIAccessibilityLoader : NSObject
@end
@implementation STFU_UIAccessibilityLoader
static Boolean
IsAccessibilityEnabled(NSString *sdkRoot)
{
NSString *frameworkPath = [sdkRoot stringByAppendingPathComponent:APP_SUPPORT_PATH];
void *appSupport = dlopen([frameworkPath fileSystemRepresentation], RTLD_LAZY);
CopyAppSupportPrefs CopyPrefs = (CopyAppSupportPrefs)dlsym(appSupport, COPY_PREFS_NAME);
if (CopyPrefs != NULL) {
CFStringRef accessibilityDomain = CopyPrefs(CFSTR("com.apple.Accessibility"));
if (accessibilityDomain != NULL) {
Boolean enabled = CFPreferencesGetAppBooleanValue(CFSTR("ApplicationAccessibilityEnabled"),
accessibilityDomain, NULL);
CFRelease(accessibilityDomain);
return enabled;
}
}
return false;
}
static BOOL
LoadAccessibilityFramework(NSString *sdkRoot)
{
NSString *frameworkPath = [sdkRoot stringByAppendingPathComponent:ACCESSIBILITY_PATH];
NSBundle *bundle = [NSBundle bundleWithPath:frameworkPath];
return [bundle load];
}
- (void)STFU_loadActualAccessibilityBundle:(NSBundle *)bundle
didLoad:(BOOL *)didLoad
loadSubbundles:(BOOL)loadSubbundles;
{
if (bundle.executablePath == nil) {
// No need to actually load this bundle which only contains localized resources.
*didLoad = YES;
} else {
[self STFU_loadActualAccessibilityBundle:bundle
didLoad:didLoad
loadSubbundles:loadSubbundles];
}
}
+ (void)load;
{
char *sdkPath = getenv("IPHONE_SIMULATOR_ROOT");
if (sdkPath != NULL) {
@autoreleasepool {
NSString *sdkRoot = [NSString stringWithUTF8String:sdkPath];
if (IsAccessibilityEnabled(sdkRoot) && LoadAccessibilityFramework(sdkRoot)) {
Class loader = object_getClass(objc_getClass("UIAccessibilityLoader"));
SEL originalSel = @selector(loadActualAccessibilityBundle:didLoad:loadSubbundles:);
SEL swizzledSel = @selector(STFU_loadActualAccessibilityBundle:didLoad:loadSubbundles:);
Method originalMethod = class_getInstanceMethod(loader, originalSel);
Method swizzledMethod = class_getInstanceMethod(self, swizzledSel);
if (originalMethod != NULL && swizzledMethod != NULL) {
if (class_addMethod(loader,
swizzledSel,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod))) {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
}
}
}
}
@end
新建该代码然后添加到编译文件里即可。