XCode5.1出现“could not build module XXX”的情况

今天调试时前几次没什么问题,之后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
新建该代码然后添加到编译文件里即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值