静态框架中使用的 Expose header
Expose header used in static framework
我有一个静态框架 B,我在框架 A 中使用它。B 有一个 class C,我也想在 A 中公开,即在下图中,我希望 App 能够使用class.
应用 > 框架 A > 静态框架 B > class C
如果我尝试在 A 的 public header 中包含 C 的 header,我会得到 'duplicate interface definition'。但是当代码从 B 编译到 A 时,我只需要公开 class 接口——大概这将允许 App 正确地 link...?
我通过一些变通方法实现了这一目标。
当静态library/framework被编译成另一个framework/static库时,它的符号仍然暴露(通过nm <binary> | grep <symbol>
验证)。这意味着您只需要您的 App 代码了解这些符号——即在框架 A.
中为 class C 包含 header
在框架 A 的 header 中,您需要包含 class C header。编译框架时需要使用"ClassC.h"
,但在使用框架时需要<FrameworkName/ClassC.h>
,因为这是它在应用程序包含的框架中的位置。为此,您可以使用在 运行 脚本阶段删除的宏。
因此,在您的框架 A 目标构建阶段,请确保您的 header for Class C 位于副本 headers 阶段的 'public' 部分,然后添加一个 'Run Script' 阶段并粘贴以下内容:
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//sg" *.h
将 `TARGET_FRAMEWORK" 更改为任何内容,或者保留它。
在 Framework A 构建设置中,在预处理器宏下,为所有构建配置添加 TARGET_FRAMEWORK=1
。
然后,在包含 Class C 的框架 A header 中,使用:
#if TARGET_FRAMEWORK
#import "ClassC.h"
#else
#import <FrameworkA/ClassC.h>
#endif
我有一个静态框架 B,我在框架 A 中使用它。B 有一个 class C,我也想在 A 中公开,即在下图中,我希望 App 能够使用class.
应用 > 框架 A > 静态框架 B > class C
如果我尝试在 A 的 public header 中包含 C 的 header,我会得到 'duplicate interface definition'。但是当代码从 B 编译到 A 时,我只需要公开 class 接口——大概这将允许 App 正确地 link...?
我通过一些变通方法实现了这一目标。
当静态library/framework被编译成另一个framework/static库时,它的符号仍然暴露(通过nm <binary> | grep <symbol>
验证)。这意味着您只需要您的 App 代码了解这些符号——即在框架 A.
在框架 A 的 header 中,您需要包含 class C header。编译框架时需要使用"ClassC.h"
,但在使用框架时需要<FrameworkName/ClassC.h>
,因为这是它在应用程序包含的框架中的位置。为此,您可以使用在 运行 脚本阶段删除的宏。
因此,在您的框架 A 目标构建阶段,请确保您的 header for Class C 位于副本 headers 阶段的 'public' 部分,然后添加一个 'Run Script' 阶段并粘贴以下内容:
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//sg" *.h
将 `TARGET_FRAMEWORK" 更改为任何内容,或者保留它。
在 Framework A 构建设置中,在预处理器宏下,为所有构建配置添加 TARGET_FRAMEWORK=1
。
然后,在包含 Class C 的框架 A header 中,使用:
#if TARGET_FRAMEWORK
#import "ClassC.h"
#else
#import <FrameworkA/ClassC.h>
#endif