【问题标题】:Check for framework's existence at compile time?在编译时检查框架是否存在?
【发布时间】:2013-03-16 13:02:30
【问题描述】:

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

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

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

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

我已经看到 2 年前 like this one 的旧问题,但没有答案浮出水面,所以我现在可能会错过一些新问题。

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

【问题讨论】:

  • 不确定是否可以,因为编译后将评估所有内容,您将收到链接器错误。但是您可以在编译之前抛出一个脚本,以检查依赖关系。然后根据脚本结果声明宏。从 make 是可行的,从 Xcode 将远非简单。顺便说一句,你应该在运行时处理弱链接 + NSClassFromString(),这样更方便
  • 嗯,谢谢你的建议。理想情况下,我希望开发人员以尽可能少的开销使用开源模块(例如,不在他们的项目中编写自定义脚本和宏)。虽然这可行,但它可能不是最优雅的。
  • :S 你在说什么领域?我在开玩笑说编译时间之前的脚本检查。你应该使用明确的弱链接,这就是它的目的。如果库不可用,您将不会收到链接器错误。由于来自客户端的所有方法调用都是动态的,因此您不会找不到符号。这就是为什么 obj-c 真的很棒
  • 好的,我有两个问题。 (1) 如果开发者的项目中不存在该框架,他们如何将其设置为弱链接?你能举个例子吗? (2) 如果框架不存在,在运行时不会运行的NSClassFromString()代码中是否还会出现编译时错误?
  • @johngraham:如果你成功实现了你的目标,你能分享一下细节吗?我希望对 Google 的 Firebase 框架做同样的事情。谢谢。

标签: ios objective-c frameworks compile-time


【解决方案1】:

我建议阅读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 如何处理高级和低级想法。它可能会做你想做的事情。

【讨论】:

  • 感谢您的回复,@mattdipasquale。 (1)“存在”/“包含在项目中”,我的意思是它被添加到“链接二进制与库”中(尽管在该构建的日志导航器中搜索 -framework 时我没有看到任何内容) . (2) 我想提供可以选择#imports & 使用框架的开源代码,如果它可以链接到 - 但无论如何,无论框架是否链接到,项目都应该编译。 ----- 因此,如果开发人员将“libMyFramework.a”添加到“Link Binary With Libraries”中,开源代码将“自动”具有额外的功能。
  • (1) 它就在那里。也许,在搜索之前双击日志。或者,您可以在“链接”步骤的详细信息下查找它。 (2) 我会选择@Greg_Parker 的回答。我不知道你能做到这一点。凉爽的。我认为您必须让开发人员手动定义宏 _MY_FRAMEWORK_EXISTS 如果他们已经包含它。
【解决方案2】:

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

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

【讨论】:

  • 感谢分享!这也是我一直在寻找的。​​span>
  • @greg-parker:我将如何解决此错误:imgur.com/a/bRgQ3 我正在尝试与 OP 做同样的事情
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 2011-10-09
  • 2019-05-22
  • 2013-11-13
  • 1970-01-01
相关资源
最近更新 更多