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

为了让MIDI通过蓝牙工作,我需要使用CoreAudioKit框架。 这工作完美,但我不能在模拟器上编译。

  1. 使框架“可选”没有帮助,错误是ld: framework not found CoreAudioKit

在这里输入图像说明

我认为它应该按照文档工作

  1. 删除框架允许我的代码进行编译

我已经得到了代码,这就是为什么我可以删除没有问题的框架。

 #if !TARGET_IPHONE_SIMULATOR #import <CoreAudioKit/CoreAudioKit.h> #endif 

我怎样才能得到这个可选的编译工作?

我其实会想到这样做,但我认为你可以用另一种方式解决。 这对我工作:

  1. 在目标设置中删除对CoreAudioKit的所有引用构build阶段 (与库链接二进制文件)

  2. 确保没有手动input类似的设置。 例如,不要添加以下设置: -weak_framework CoreAudioKit其他链接器标志中

  3. 使用预处理器标志来有条件地编译你的模拟器的代码:

 #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理一个较旧的项目,请确保它们已被启用。

其他参考

https://stackoverflow.com/a/26510640/119114

https://stackoverflow.com/a/25883210/8047

为了链接某些东西(甚至很弱),它需要在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:

  1. 使用clang模块的自动链接支持
  2. 使用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。