可选框架不工作(CoreAudioKit不在模拟器上)
为了让MIDI通过蓝牙工作,我需要使用CoreAudioKit
框架。 这工作完美,但我不能在模拟器上编译。
- 使框架“可选”没有帮助,错误是
ld: framework not found CoreAudioKit
我认为它应该按照文档工作
- 删除框架允许我的代码进行编译
我已经得到了代码,这就是为什么我可以删除没有问题的框架。
#if !TARGET_IPHONE_SIMULATOR #import <CoreAudioKit/CoreAudioKit.h> #endif
我怎样才能得到这个可选的编译工作?
我其实会想到这样做,但我认为你可以用另一种方式解决。 这对我工作:
-
在目标设置中删除对CoreAudioKit的所有引用构build阶段 (与库链接二进制文件)
-
确保没有手动input类似的设置。 例如,不要添加以下设置:
-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 }
注意:在我上面的示例中,您可能不需要testingCABTMIDICentralViewController
类的存在。 这取决于您的应用是仅针对iOS 8+还是iOS 7。
更新
按照@Yar和@JeremyHuddlestonSequoia的注释,请注意,此解决scheme要求您在项目构build设置中自动 启用模块和链接框架 。 这些Xcode设置现在默认为这种技术的正确值,但是如果你正在pipe理一个较旧的项目,请确保它们已被启用。
其他参考
为了链接某些东西(甚至很弱),它需要在SDK中出现。 如果你没有实际使用框架,那并不重要; 链接器将错误,如果指示包含一个链接到它找不到的文件。
您将需要根据所使用的SDK有条件地编译和链接您的项目。 具体而言,在定位iOS SDK时,您需要包含对CoreAudioKit.framework的支持和链接。 针对iOS模拟器SDK时,您不希望包含此支持或链接。
要条件化代码,您需要包含头文件,并使用TARGET_OS_SIMULATORmacros(或者对于iOS 9.0以上版本的SDK使用已弃用的TARGET_IPHONE_SIMULATORmacros)。 这个标题通常是通过其他内容拉入的,但最好自己做。
例如:
#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不支持目标构build阶段中的SDK条件链接,因此请确保您不在目标的链接二进制与库构build阶段中包含CoreAudioKit.framework。 要处理链接,你基本上有两个select:
- 使用clang模块的自动链接支持
- 使用SDK条件链接器标志
要使用自动链接,您必须设置Xcode的启用模块(C和Objective C)和链接框架自动构build设置打开。
如果你正在尝试使用旧的工具链来完成这样的事情,或者像对链接进行更严格的控制一样,你仍然可以使用SDK-conditional 其他链接器标志来build立设置。 为此构build设置创buildSDK条件条目,以便在默认情况下使用“-framework CoreAudioKit”(或“-weak_framework CoreAudioKit”),在定位模拟器SDK时不使用。 这个截图应该更清楚。
如果您的iOS部署目标版本比iOS 8版本旧,那么您应该确保在iOS 8中添加了该链接,因为它是在iOS 8中添加的。如果lockingiOS 8或更高版本,则可以安全地使用-framework CoreAudioKit。