可选框架不工作(CoreAudioKit 不在模拟器上)
Optional Framework Not Working (CoreAudioKit not on Simulator)
要通过蓝牙运行 MIDI,我需要使用 CoreAudioKit
框架。这非常有效,但我无法在模拟器上编译。
- 制作框架"optional"没有帮助,错误是
ld: framework not found CoreAudioKit
我认为它应该根据 the docs
工作
- 删除框架允许我的代码编译
我在代码中得到了这个,这就是为什么我可以毫无问题地删除框架的原因。
#if !TARGET_IPHONE_SIMULATOR
#import <CoreAudioKit/CoreAudioKit.h>
#endif
我怎样才能让这个可选的编译工作?
我本来以为这行得通,但我认为你可以用另一种方式解决它。这对我有用:
删除目标设置中对 CoreAudioKit 的所有引用 构建阶段(Link 带库的二进制文件)
确保没有手动输入类似的设置。例如,不要在 Other Linker Flags
中添加此设置:-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
class 是否存在。这取决于您的应用是仅针对 iOS 8+ 还是 iOS 7.
更新
根据@Yar 和@JeremyHuddlestonSequoia 下面的评论,请注意此解决方案要求您自动启用模块 和Link 框架 在项目构建设置中。这些 Xcode 设置现在默认为该技术的正确值,但如果您管理的是较旧的项目,请确保它们已启用。
其他参考资料
为了 link 一些东西(即使是微弱的),它需要出现在 SDK 中。如果您实际上不使用该框架也没关系;如果指示将 link 包含到它找不到的文件中,linker 将出错。
您需要根据所使用的 SDK 有条件地编译和 link 您的项目。具体来说,当以 iOS SDK 为目标时,您需要包含对 CoreAudioKit.framework 的支持和 link。当以 iOS Simulator SDK 为目标时,您将不希望包含此支持或 linkage.
要条件化您的代码,您需要包含 header 并使用 TARGET_OS_SIMULATOR 宏(或者对于早于 iOS 9.0 的 SDK,已弃用的 TARGET_IPHONE_SIMULATOR 宏).这个 header 通常是通过其他 include 引入的,但最好自己这样做。
例如:
#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-conditional linking,因此确保不在 [ 中包含 CoreAudioKit.framework =69=] Binary With Libraries 目标构建阶段。要处理 linking,您基本上有两个选择:
- 使用来自 clang 模块的自动 linking 支持
- 使用 SDK-conditional linker 标志
要使用自动 linking,您必须设置 Xcode 的 启用模块(C 和 Objective C) 和 Link 框架自动 构建设置已打开。
如果您尝试使用较旧的工具链完成类似的事情,或者只是想更严格地控制 linking,您仍然可以使用 SDK-conditional Other Linker Flags 构建设置。为此构建设置创建 SDK-conditional 条目,以便默认情况下使用“-framework CoreAudioKit”(或“-weak_framework CoreAudioKit”),而在针对模拟器 SDK 时不使用任何内容。这个截图应该更清楚。
如果您的 iOS 部署目标早于 iOS 8,您应该确保削弱 link 框架,因为它是在 iOS 8 中添加的。如果针对 iOS 8 或更高版本,您可以安全地使用 -framework CoreAudioKit。
要通过蓝牙运行 MIDI,我需要使用 CoreAudioKit
框架。这非常有效,但我无法在模拟器上编译。
- 制作框架"optional"没有帮助,错误是
ld: framework not found CoreAudioKit
我认为它应该根据 the docs
工作- 删除框架允许我的代码编译
我在代码中得到了这个,这就是为什么我可以毫无问题地删除框架的原因。
#if !TARGET_IPHONE_SIMULATOR
#import <CoreAudioKit/CoreAudioKit.h>
#endif
我怎样才能让这个可选的编译工作?
我本来以为这行得通,但我认为你可以用另一种方式解决它。这对我有用:
删除目标设置中对 CoreAudioKit 的所有引用 构建阶段(Link 带库的二进制文件)
确保没有手动输入类似的设置。例如,不要在 Other Linker Flags
中添加此设置:-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
class 是否存在。这取决于您的应用是仅针对 iOS 8+ 还是 iOS 7.
更新
根据@Yar 和@JeremyHuddlestonSequoia 下面的评论,请注意此解决方案要求您自动启用模块 和Link 框架 在项目构建设置中。这些 Xcode 设置现在默认为该技术的正确值,但如果您管理的是较旧的项目,请确保它们已启用。
其他参考资料
为了 link 一些东西(即使是微弱的),它需要出现在 SDK 中。如果您实际上不使用该框架也没关系;如果指示将 link 包含到它找不到的文件中,linker 将出错。
您需要根据所使用的 SDK 有条件地编译和 link 您的项目。具体来说,当以 iOS SDK 为目标时,您需要包含对 CoreAudioKit.framework 的支持和 link。当以 iOS Simulator SDK 为目标时,您将不希望包含此支持或 linkage.
要条件化您的代码,您需要包含 header 并使用 TARGET_OS_SIMULATOR 宏(或者对于早于 iOS 9.0 的 SDK,已弃用的 TARGET_IPHONE_SIMULATOR 宏).这个 header 通常是通过其他 include 引入的,但最好自己这样做。
例如:
#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-conditional linking,因此确保不在 [ 中包含 CoreAudioKit.framework =69=] Binary With Libraries 目标构建阶段。要处理 linking,您基本上有两个选择:
- 使用来自 clang 模块的自动 linking 支持
- 使用 SDK-conditional linker 标志
要使用自动 linking,您必须设置 Xcode 的 启用模块(C 和 Objective C) 和 Link 框架自动 构建设置已打开。
如果您尝试使用较旧的工具链完成类似的事情,或者只是想更严格地控制 linking,您仍然可以使用 SDK-conditional Other Linker Flags 构建设置。为此构建设置创建 SDK-conditional 条目,以便默认情况下使用“-framework CoreAudioKit”(或“-weak_framework CoreAudioKit”),而在针对模拟器 SDK 时不使用任何内容。这个截图应该更清楚。
如果您的 iOS 部署目标早于 iOS 8,您应该确保削弱 link 框架,因为它是在 iOS 8 中添加的。如果针对 iOS 8 或更高版本,您可以安全地使用 -framework CoreAudioKit。