在静态框架中使用的公开头文件
问题描述:
我有一个静态框架B,我在框架A中使用.B有一个类CI也想在A中公开,即在下面的插图中,我希望应用程序能够使用类。在静态框架中使用的公开头文件
应用>框架A>静态框架B> C类
如果我尝试包括A的公共标题对C的头,我得到“重复的接口定义”。但是,当代码从B编译成A时,我只需要公开类接口 - 大概是允许应用程序正确链接...?
答
我通过一些解决方法实现了这一点。
当一个静态库/框架被编译到另一个框架/静态库时,它的符号仍然暴露(通过nm <binary> | grep <symbol>
验证)。这意味着您只需要您的应用程序代码即可了解这些符号 - 即包括框架A中类C的标头。
在您的框架A的标题中,您需要包含类C标题。在编译框架时,您需要使用"ClassC.h"
,但是当框架正在使用时,您需要<FrameworkName/ClassC.h>
,因为这是它在App包含的框架中的位置。为此,您使用在运行脚本阶段中删除的宏。
所以,在你的框架的一个目标构建阶段,请确保您的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”是什么,或者离开它。
在框架构建设置下预处理宏,添加TARGET_FRAMEWORK=1
所有编译配置。
然后,在你的框架头,其中包括类C,使用:
#if TARGET_FRAMEWORK
#import "ClassC.h"
#else
#import <FrameworkA/ClassC.h>
#endif
创建一个头导入B和C,然后将其导入到A? – antonio081014
我可以导入标题,它在A中公开,导致我的问题。 – Nick