2017-03-02 31 views
1

我有一个静态框架B,我在框架A中使用.B有一个类CI也想在A中公开,即在下面的插图中,我希望应用程序能够使用类。在静态框架中使用的公开头文件

应用>框架A>静态框架B> C类

如果我尝试包括A的公共标题对C的头,我得到“重复的接口定义”。但是,当代码从B编译成A时,我只需要公开类接口 - 大概是允许应用程序正确链接...?

+0

创建一个头导入B和C,然后将其导入到A? – antonio081014

+0

我可以导入标题,它在A中公开,导致我的问题。 – Nick

回答

0

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

当一个静态库/框架被编译到另一个框架/静态库时,它的符号仍然暴露(通过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