要让MIDI通过蓝牙工作,我需要使用CoreAudioKit
框架。这很好用,但我无法在模拟器上编译。
ld: framework not found CoreAudioKit
我认为它应该根据the docs
运作我在代码中得到了这个,这就是为什么我可以删除框架而没有问题。
#if !TARGET_IPHONE_SIMULATOR
#import <CoreAudioKit/CoreAudioKit.h>
#endif
<小时/> 如何才能使此可选编辑生效?
答案 0 :(得分:6)
我实际上会认为这样可行,但我认为你可以用另一种方式解决它。这对我有用:
删除目标设置中对CoreAudioKit的所有引用构建阶段(使用库链接二进制文件)
确保没有手动输入的类似设置。例如,请勿在其他链接标记
-weak_framework CoreAudioKit
使用预处理程序标志有条件地编译模拟器的代码:
#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设置默认为此技术的正确值,但如果您要管理较旧的项目,请确保它们已启用。
答案 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。要处理链接,您基本上有两个选项:
要使用自动链接,您必须设置Xcode的启用模块(C和Objective C)和自动链接框架构建设置。
如果您尝试使用较旧的工具链来完成此类操作,或者就像对链接进行更严格的控制一样,您仍然可以使用SDK条件其他链接器标记构建设置来完成此操作。为此构建设置创建SDK条件条目,以便默认情况下使用“-framework CoreAudioKit”(或“-weak_framework CoreAudioKit”),并且在定位模拟器SDK时不使用任何内容。此屏幕截图应该更清晰。
如果您的iOS部署目标比iOS 8旧,您应该确保弱化链接框架,因为它是在iOS 8中添加的。如果定位到iOS 8或更高版本,您可以安全地使用-framework CoreAudioKit。