ios - 检查编译时是否添加了框架 - iOS

标签 ios objective-c llvm

我目前正在从事一个项目,该项目有一个引用 Security.h 框架的类。由于这是一个可重用的类,并且可能会在多个项目中使用,因此我希望添加一个编译时检查以检查安全框架是否已添加到项目中。我所说的添加到项目的意思是它是否已添加到当前目标的Link Binary With Libraries构建阶段。

现在,我知道标题相似的问题已经被问过多次,并且this particular question似乎非常接近我要找的东西,但我也没有在那里找到答案。

我一直在使用:

#ifdef __SENTINEL_VALUE_
..conditional code here..
#endif

代码,但这在框架 header 在主 header 中声明哨兵值时有效。让我举两个例子来比较和对比:

SystemConfiguration.framework 有一个框架头 SystemConfiguration.h,它包括所有的子头,但也声明了它自己的标记值,即 _SYSTEMCONFIGURATION_H

因此,使用 #ifdef _SYSTEMCONFIGURATION_H 检查它是完美的。但是,对于 Security.framework,框架 header Security.h 没有声明自己的标记值。它的每个子 header 都声明了自己的哨兵值,但由于它们是在 Security.h 中导入的,因此哨兵值得到了定义。因此,即使 Security.framework 未包含在项目中(未链接到构建阶段),其子 header 之一的 #ifndef 也会返回错误值,由于哨兵值是由于其在 Security.h 文件中的导入而定义的(更不用说这种检查框架 header 的子 header 的方法让我感到有点难过)。

所以,我的问题是:对于像 Security.framework 这样的独特案例,什么是适当的编译时间 检查以检查框架是否已添加到Link Binary With Libraries 阶段(如果存在这样的检查)。

此外,我知道 NSClassFromString() 方法和 NS_CLASS_AVAILABLE 宏,但我不是在寻找运行时解决方案。

在此先感谢大家!

干杯!

最佳答案

链接阶段在编译阶段之后,因此编译器无法判断框架是否会链接到项目。

如果您的项目产品是框架动态库或可执行文件,您只需将二进制文件链接到安全框架,就可以了。

如果您的项目产品是静态 库,您需要确认生成最终可执行二进制文件的项目将链接到安全框架。推荐的方法是提供安装和使用文档,可能还有示例。

关于ios - 检查编译时是否添加了框架 - iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17751814/

相关文章:

ios - 如何从 subView 开始获取 ViewController 实例

ios - isRegisteredForRemoteNotifications 返回 true 即使我完全禁用它

optimization - LLVM 插入值优化不好?

ios - 将视频裁剪为方形 iOS

ios - %i 和 %li 有什么区别?

iphone - 绘制圆的一部分

LLVM 相当于命令行上的 gcc -D 宏定义

ios - Xcode 构建错误,arm-apple-darwin11-gcc-4.2.1 execvp : No such file or directory

ios - 如何修复“AIRMap”未在 react native 的 UIManager 错误中找到?

ios - UITextView 由于行数和字符数限制文本