我有一个静态框架B,我在框架A中使用.B有一个C类我想在A中公开,即在下图中我希望App能够使用该类。
App&gt;框架A&gt; <静态框架B> C级
如果我尝试在A的公共标题中包含C的标题,我会得到“重复的接口定义”。但是当代码从B编译成A时,我只需要公开类接口 - 可能会让App正确链接......?
答案 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