21

我正在开发一个可以选择使用闭源框架的开源项目。如果项目中包含闭源框架,将会有额外的功能。但是如果项目中没有包含框架,项目应该仍然可以正确编译。

如果框架包含在项目中,如何在编译时检查?

基本上,我想做这样的事情:

#ifdef _MY_FRAMEWORK_EXISTS
#import <MyFramework/MyFramework.h>
#endif

我已经看到了 2 年前的老问题,比如这个,但是没有答案浮出水面,所以我现在可能会错过一些新的东西。

我不想在运行时通过 进行检查NSClassFromString(),因为当我尝试导入MyFramework并且它不存在时,这将在编译时失败。

4

2 回答 2

21

您可以使用 __has_include 语言扩展名检查头文件是否存在。 http://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros

但是,这只告诉您是否安装了头文件。它无法告诉您“Link Binary With Libraries”是否已链接到其框架。

于 2013-03-27T07:53:10.237 回答
2

我建议阅读Mac 开发者库:框架编程指南(其中包括关于弱链接的部分)。

  1. “存在”或“包含在项目中”是什么意思?您的意思是添加到“Link Binary With Libraries”构建阶段(如Include Frameworks所述)?所做的只是影响链接,而不是编译、构建阶段。要看到这一点,请构建。-framework然后,在 Xcode 的 Log Navigator 的构建日志中搜索。

    所以,是的,如果你想影响你提供的代码的编译,你可以手动定义宏_MY_FRAMEWORK_EXISTS

  2. 我真的不明白你想做什么。你能在更高的层次上解释你想要什么吗?也许,有更好的方法来解决它。

    “最小开销”很好,但太多的魔法可能会令人困惑。例如,Xcode 的魔力隐藏了包含框架时真正发生的事情。

    我还建议查看适用于 iOS 的 Facebook SDK如何处理高级和低级创意。它可能会做你想做的事情。

于 2013-03-26T19:46:36.907 回答