Ios 可选框架不工作(CoreAudioKit不在模拟器上)

Ios 可选框架不工作(CoreAudioKit不在模拟器上),ios,ios-simulator,coremidi,Ios,Ios Simulator,Coremidi,要使蓝牙MIDI正常工作,我需要使用CoreAudioKit框架。这很好,但我无法在模拟器上编译 将框架设置为“可选”没有帮助,错误是ld:frameworknotfoundcoreaudiokit 我认为它应该按照 删除框架允许我的代码进行编译 我在代码中有这一点,这就是为什么我可以毫无问题地删除框架 #if !TARGET_IPHONE_SIMULATOR #import <CoreAudioKit/CoreAudioKit.h> #endif #如果!目标IPHONE模拟器

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

  • 将框架设置为“可选”没有帮助,错误是
    ld:frameworknotfoundcoreaudiokit
  • 我认为它应该按照

  • 删除框架允许我的代码进行编译
  • 我在代码中有这一点,这就是为什么我可以毫无问题地删除框架

    #if !TARGET_IPHONE_SIMULATOR
    #import <CoreAudioKit/CoreAudioKit.h>
    #endif
    
    #如果!目标IPHONE模拟器
    #进口
    #恩迪夫
    


    我怎样才能让这个可选的编译工作呢?我实际上认为这会工作,但我认为你可以用另一种方法来解决它。这对我很有用:

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

  • 确保没有手动输入类似的设置。例如,不要在其他链接器标志中添加以下设置:
    -weak\u framework CoreAudioKit

  • 使用预处理器标志有条件地编译模拟器代码:

  • 注意:在我上面的示例中,您可能不需要测试
    cabtmidCentralViewController
    类的存在性。这取决于你的应用程序是只针对iOS 8+,还是同时针对iOS 7

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

    其他参考资料


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

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

    要对代码进行条件化,您需要包含标头并使用TARGET_OS_SIMULATOR宏(或针对iOS 9.0之前的SDK的不推荐使用的TARGET_IPHONE_SIMULATOR宏)。此标题通常通过其他包含项拉入,但最好自己拉入

    例如:

    #导入“MyController.h”
    #进口
    #如果!目标IPHONE模拟器
    #进口
    #恩迪夫
    @实现视图控制器
    -(无效)viewDidLoad{
    [超级视图下载];
    #如果!目标\u IPHONE\u模拟器
    //依赖CoreAudioKit的东西
    #恩迪夫
    }
    @结束
    
    Xcode在目标的构建阶段不支持SDK条件链接,因此请确保在链接二进制文件与库构建阶段不包含目标的CoreAudioKit.framework。要处理链接,基本上有两个选项:

  • 使用来自叮当模块的自动链接支持
  • 使用SDK条件链接器标志
  • 要使用自动链接,您必须设置Xcode的启用模块(C和目标C)自动链接框架构建设置处于启用状态

    如果您正试图用较旧的工具链完成类似的操作,或者只是想更严格地控制链接,那么您仍然可以使用SDK条件其他链接器标志构建设置来完成。为此构建设置创建SDK条件项,以便在默认情况下使用“-framework CoreAudioKit”(或“-weak_framework CoreAudioKit”),而在针对模拟器SDK时不使用任何内容。这个屏幕截图应该更清楚


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

    太棒了!这工作非常完美,我认为您不需要使用
    CabtMidCentralViewController
    的安全性。。。关于这一点,我感到惊讶的是使用了
    @import
    ,并且需要根据以下答案打开它:非常感谢您帮助解决此问题。太好了@是的,
    if([cabtmidCentralViewController类])
    test更多的是测试iOS8和iOS7,而不是测试设备和模拟器。在某个时候,有人必须检查他们是否在使用
    UIViewController
    nil
    ,但只要我的代码正在编译,我就对当前的问题感到高兴。谢谢again@JeremyHuddlestonSequoia,您有一些有用的信息,但请不要编辑已接受的答案以从根本上改变其含义。如果您愿意,只需添加您自己的新答案。您插入的短语“解决此问题的方法是使用以SDK为条件的链接参数”,与我描述的解决方案(#1-3)不匹配,因此它使答案变得混乱和矛盾。@JeremyHuddlestonSequoia,我一点也没有忘记它。我特别建议不要添加link参数。我上面显示的代码包括
    @import CoreAudioKit。你能解释一下“破坏用户构建目标设备的能力”是什么意思吗?我已经用这段代码构建了一个hello world程序,它肯定是为模拟器或设备构建的。跑步也是。这里有很多要读的内容,那么:与Nate的答案相比,这里有什么不同?我添加这个答案是为了提供更多的解释,说明为什么你会看到这个问题,并解释你的各种选择。Nate的回答假设“自动链接框架”已启用,我提供了一个附加选项,用于说明“自动链接框架”未启用(或无法启用)的情况。谢谢。这太棒了。如果你能把它弄得更干净,我会喜欢的
    
    #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
    }
    
    #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