4

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

现在,我知道类似标题的问题已被多次询问,而且这个特定问题似乎与我正在寻找的内容非常接近,但我也没有在那里找到答案。

我一直在使用:

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

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

SystemConfiguration.framework有一个框架头SystemConfiguration.h,其中包括所有子头,但也声明了自己的哨兵值,即_SYSTEMCONFIGURATION_H

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

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

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

提前谢谢大家!

干杯!

4

2 回答 2

2

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

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

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

于 2013-07-19T17:29:20.910 回答
0

这可能为时已晚,但对于遇到此类问题的人的未来参考,请尝试此

BOOL isFrameworkLoaded = (NSClassFromString(@"MyClassNameFromTheFramework") != nil);

不能相信,这是原始帖子的链接

https://stackoverflow.com/a/7333589/4160199

于 2015-09-18T18:57:44.460 回答