暴露在静态框架中使用的标头

时间:2017-03-02 17:54:16

标签: ios objective-c xcode static-linking

我有一个静态框架B,我在框架A中使用.B有一个C类我想在A中公开,即在下图中我希望App能够使用该类。

App&gt;框架A&gt; <静态框架B> C级

如果我尝试在A的公共标题中包含C的标题,我会得到“重复的接口定义”。但是当代码从B编译成A时,我只需要公开类接口 - 可能会让App正确链接......?

1 个答案:

答案 0 :(得分:0)

我通过一些解决方法实现了这一目标。

当静态库/框架被编译到另一个框架/静态库时,它的符号仍然暴露(通过nm <binary> | grep <symbol>验证)。这意味着您只需要您的应用程序代码就可以了解这些符号 - 即在框架A中包含C类的标题。

在框架A的标头中,您需要包含C类标头。在编译框架时,您需要使用"ClassC.h",但是在使用框架时,您需要<FrameworkName/ClassC.h>,因为这是它在App包含的框架中的位置。要执行此操作,请使用在运行脚本阶段删除的宏。

因此,在您的框架A目标构建阶段,确保您的C类标题位于复制标题阶段的“公共”部分,然后添加“运行脚本”阶段并粘贴以下内容:

TARGET_MACRO="TARGET_FRAMEWORK"
cd -P "$BUILT_PRODUCTS_DIR/$WRAPPER_NAME/Headers/"
perl -0pi -e "s/\#if ${TARGET_MACRO}.*?\#else\r?\n?(.*?)\r?\n?\#endif/\1/sg" *.h

将“TARGET_FRAMEWORK”更改为任何内容,或将其保留。

在Framework A构建设置中,在预处理器宏下,为所有构建配置添加TARGET_FRAMEWORK=1

然后,在包含C类的Framework A标头中,使用:

#if TARGET_FRAMEWORK
#import "ClassC.h"
#else
#import <FrameworkA/ClassC.h>
#endif