在编译时检查框架是否存在?

时间:2013-03-26 16:16:11

标签: ios objective-c frameworks compile-time

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

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

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

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

我见过2年前的问题like this one,但没有答案浮出水面,所以我现在可能会遗漏一些新东西。

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

2 个答案:

答案 0 :(得分:19)

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

但是,这只会告诉您是否安装了头文件。它无法告诉您“Link Binary With Libraries”是否与其框架相关联。

答案 1 :(得分:2)

我建议您阅读Mac Developer Library : Framework Programming Guide(其中包含Weak Linking部分)。

  1. “存在”或“包含在项目中”是什么意思?您的意思是添加到“Link Binary With Libraries”构建阶段(如Including Frameworks所述)?所有这一切都会影响linking, not the compilation,构建阶段。要看到这个,建立。然后,在Xcode的Log Navigator的构建日志中搜索-framework

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

  2. 我真的不明白你要做什么。你能解释一下你想要的更高水平吗?也许,有一个更好的方法来解决它。

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

    我还建议您查看Facebook SDK for iOS如何适用于高和低?低层次的想法。它可能会做你想做的事情。