在编译时检查框架的存在吗?

我正在开发一个可以select使用闭源框架的开源项目。 如果项目中包含闭源框架,则会有附加function。 但是,如果框架不包括在项目中,项目仍然应该正确编译。

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

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

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

我已经看到了两年前的老问题,但是没有回答,所以我现在可能会错过一些新的东西。

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

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

但是,这只会告诉你,如果头文件被安装。 它不能告诉你“链接二进制与图书馆”链接到其框架。

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

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

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

  2. 我真的不明白你在做什么。 你能解释一下你想要的更高层次吗? 也许,还有更好的办法。

    “最小的开销”是好的,但太多的魔法可能会让人困惑。 例如,Xcode的魔法隐藏了包含框架的真实情况。

    我还build议查看Facebook SDK for iOS如何适用于高级和低级别的想法。 它可能会做你想做的事情。