Ios 可选框架不工作(CoreAudioKit不在模拟器上)
要使蓝牙MIDI正常工作,我需要使用Ios 可选框架不工作(CoreAudioKit不在模拟器上),ios,ios-simulator,coremidi,Ios,Ios Simulator,Coremidi,要使蓝牙MIDI正常工作,我需要使用CoreAudioKit框架。这很好,但我无法在模拟器上编译 将框架设置为“可选”没有帮助,错误是ld:frameworknotfoundcoreaudiokit 我认为它应该按照 删除框架允许我的代码进行编译 我在代码中有这一点,这就是为什么我可以毫无问题地删除框架 #if !TARGET_IPHONE_SIMULATOR #import <CoreAudioKit/CoreAudioKit.h> #endif #如果!目标IPHONE模拟器
CoreAudioKit
框架。这很好,但我无法在模拟器上编译
ld:frameworknotfoundcoreaudiokit
#if !TARGET_IPHONE_SIMULATOR
#import <CoreAudioKit/CoreAudioKit.h>
#endif
#如果!目标IPHONE模拟器
#进口
#恩迪夫
我怎样才能让这个可选的编译工作呢?我实际上认为这会工作,但我认为你可以用另一种方法来解决它。这对我很有用:
-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。要处理链接,基本上有两个选项:
如果您的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