我正在开发一个可以选择使用闭源框架的开源项目。如果闭源框架包含在项目中,则会有其他功能。但是如果框架没有包含在项目中,项目仍应正确编译。
如果框架包含在项目中,我如何在编译时检查?
基本上,我想做这样的事情:
#ifdef _MY_FRAMEWORK_EXISTS
#import <MyFramework/MyFramework.h>
#endif
我见过2年前的问题like this one,但没有答案浮出水面,所以我现在可能会遗漏一些新东西。
我不想通过NSClassFromString()
在运行时检查,因为当我尝试导入MyFramework
并且它不存在时,这将在编译时失败。
答案 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部分)。
“存在”或“包含在项目中”是什么意思?您的意思是添加到“Link Binary With Libraries”构建阶段(如Including Frameworks所述)?所有这一切都会影响linking, not the compilation,构建阶段。要看到这个,建立。然后,在Xcode的Log Navigator的构建日志中搜索-framework
。
所以,是的,如果您想影响您提供的代码的编译,您可以手动定义宏_MY_FRAMEWORK_EXISTS
。
我真的不明白你要做什么。你能解释一下你想要的更高水平吗?也许,有一个更好的方法来解决它。
“最小开销”很不错,但太多的魔法可能令人困惑。例如,Xcode的魔力掩盖了包含框架时真正发生的事情。
我还建议您查看Facebook SDK for iOS如何适用于高和低?低层次的想法。它可能会做你想做的事情。