【发布时间】: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