我目前正在从事一个项目,该项目有一个引用 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/