可选框架不起作用(CoreAudioKit不在模拟器上)

时间:2015-07-22 21:36:25

标签: ios ios-simulator coremidi

要让MIDI通过蓝牙工作,我需要使用CoreAudioKit框架。这很好用,但我无法在模拟器上编译。

  1. 使框架“可选”没有帮助,错误是ld: framework not found CoreAudioKit
  2. enter image description here

    我认为它应该根据the docs

    运作
    1. 删除框架允许我的代码编译
    2. 我在代码中得到了这个,这就是为什么我可以删除框架而没有问题。

      #if !TARGET_IPHONE_SIMULATOR
      #import <CoreAudioKit/CoreAudioKit.h>
      #endif
      

      <小时/> 如何才能使此可选编辑生效?

2 个答案:

答案 0 :(得分:6)

我实际上会认为这样可行,但我认为你可以用另一种方式解决它。这对我有用:

  1. 删除目标设置中对CoreAudioKit的所有引用构建阶段(使用库链接二进制文件)

  2. 确保没有手动输入的类似设置。例如,请勿在其他链接标记

  3. 中添加此设置:-weak_framework CoreAudioKit
  4. 使用预处理程序标志有条件地编译模拟器的代码:

  5. #import "ViewController.h"
    
    #if !TARGET_IPHONE_SIMULATOR
    @import CoreAudioKit;
    #endif
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
       [super viewDidLoad];
       // Do any additional setup after loading the view, typically from a nib.
    
    #if !TARGET_IPHONE_SIMULATOR
       if ([CABTMIDICentralViewController class]) {   // maybe not needed?
          CABTMIDICentralViewController *vc = [[CABTMIDICentralViewController alloc] init];
       }
    #endif
    }
    

    注意:在上面的示例中,您可能需要测试是否存在CABTMIDICentralViewController类。这取决于您的应用是仅定位到iOS 8+还是iOS 7。

    更新

    以下@Yar和@JeremyHuddlestonSequoia的评论请注意,此解决方案要求您在项目构建设置中启用模块自动链接框架。现在,这些Xcode设置默认为此技术的正确值,但如果您要管理较旧的项目,请确保它们已启用。

    其他参考资料

    https://stackoverflow.com/a/26510640/119114

    https://stackoverflow.com/a/25883210/8047

答案 1 :(得分:2)

为了链接某些东西(甚至是弱的),它需要存在于SDK中。如果你不实际使用框架并不重要;如果指示包含指向无法找到的文件的链接,链接器将会出错。

您需要根据所使用的SDK有条件地编译和链接您的项目。具体来说,在定位iOS SDK时,您需要包含对CoreAudioKit.framework的支持和链接。在定位iOS模拟器SDK时,您不希望包含此支持或链接。

要条件化您的代码,您需要包含标头并使用TARGET_OS_SIMULATOR宏(或对于早于iOS 9.0的SDK,不推荐使用的TARGET_IPHONE_SIMULATOR宏)。此标题通常通过其他包含引入,但最好自己这样做。

例如:

#import "MyController.h"
#import <TargetConditionals.h>

#if !TARGET_IPHONE_SIMULATOR
#import <CoreAudioKit/CoreAudioKit.h>
#endif

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];

#if !TARGET_IPHONE_SIMULATOR
   // Stuff dependent on CoreAudioKit
#endif
}
@end

Xcode在目标的构建阶段不支持SDK条件链接,因此请确保在目标的 Link Binary With Libraries 构建阶段中不包含CoreAudioKit.framework。要处理链接,您基本上有两个选项:

  1. 使用clang模块的自动链接支持
  2. 使用SDK条件链接器标志
  3. 要使用自动链接,您必须设置Xcode的启用模块(C和Objective C)自动链接框架构建设置。

    如果您尝试使用较旧的工具链来完成此类操作,或者就像对链接进行更严格的控制一样,您仍然可以使用SDK条件其他链接器标记构建设置来完成此操作。为此构建设置创建SDK条件条目,以便默认情况下使用“-framework CoreAudioKit”(或“-weak_framework CoreAudioKit”),并且在定位模拟器SDK时不使用任何内容。此屏幕截图应该更清晰。

    build settings screenshot

    如果您的iOS部署目标比iOS 8旧,您应该确保弱化链接框架,因为它是在iOS 8中添加的。如果定位到iOS 8或更高版本,您可以安全地使用-framework CoreAudioKit。