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

检查编译时是否添加了框架-iOS,ios,objective-c,llvm,Ios,Objective C,Llvm,我目前正在从事一个项目,该项目有一个引用Security.h框架的类。由于这是一个可重用的类,并且可能在多个项目中使用,因此我希望添加一个编译时检查来检查安全框架是否已添加到项目中。我所说的添加到项目的意思是,它是否已添加到当前目标的带库链接二进制文件构建阶段 现在,我知道类似标题的问题已经被问了很多次,似乎非常接近我想要的,但我也没有找到答案 我一直在使用: #ifdef __SENTINEL_VALUE_ ..conditional code here.. #endif 代码,但只有当框架

我目前正在从事一个项目,该项目有一个引用Security.h框架的类。由于这是一个可重用的类,并且可能在多个项目中使用,因此我希望添加一个编译时检查来检查安全框架是否已添加到项目中。我所说的添加到项目的意思是,它是否已添加到当前目标的带库链接二进制文件构建阶段

现在,我知道类似标题的问题已经被问了很多次,似乎非常接近我想要的,但我也没有找到答案

我一直在使用:

#ifdef __SENTINEL_VALUE_
..conditional code here..
#endif
代码,但只有当框架标头在主标头中声明sentinel值时,此才起作用。让我举两个例子进行比较和对比:

SystemConfiguration.framework
有一个framework头
SystemConfiguration.h
,它包括所有的子头,但也声明它自己的哨兵值,即
\u SystemConfiguration\u h

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

因此,我的问题是:对于像
Security.framework
这样的独特情况,检查框架是否已添加到链接二进制文件与库阶段(如果存在这样的检查)的适当编译时检查是什么

此外,我知道
NSClassFromString()
方法和可用的
NS\u CLASS\u
宏,但我不想寻找运行时解决方案

提前谢谢大家


干杯!

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

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


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

这可能有点太晚了,但供将来参考遇到这种问题,试试这个

BOOL isFrameworkLoaded = (NSClassFromString(@"MyClassNameFromTheFramework") != nil);
这是一个原始帖子的链接


您在xCode中尝试过产品>生成输出>预处理文件吗?我没有尝试过,但这对我的编译时检查有什么帮助?它显示了编译器看到的内容。您可以看到您想要声明的内容是否在此文件中声明。不确定它是否能回答您的问题,但我想我会建议。啊,谢谢谢谢你的回复。是的,我知道链接阶段在编译阶段之后。我的问题更多的是关于是否包含框架,以及是否有明确检查符号是否已定义的指令。测试库中的符号是否已定义是不可靠的,因为您可以#include/#导入公共头,尽管客户端可能不会链接到框架。这将导致在生成最终可执行文件时出现未定义的符号错误。另一方面,如果您在库源代码中使用任何符号,您就知道您仍然包含了头,否则您将得到编译错误。