防止Xcode从静态库中删除未使用的符号

时间:2014-03-02 23:23:26

标签: ios objective-c static-linking

我已经构建了一个静态库,我是我的iOS二进制文件链接。静态库的代码剥离等等,我可以看到存档中的符号(通过nm)。

因此,我将该库作为框架链接到我的应用程序中。但是,我实际上并没有直接调用该函数。结果,我可以看到我直接在我的二进制文件中调用的符号,而不是那些未调用的符号。但是,因为我实际上希望这些符号在运行时存在,所以我用-all_load编译。

但是,这似乎给图书馆的用户带来了不必要的负担。我可以在静态库中添加一些强制执行此操作的东西,而不是依赖于库的用户吗?

1 个答案:

答案 0 :(得分:0)

根据您要完成的操作, 可以精确控制哪些符号被剥离,哪些符号始终被加载,即使库的用户没有实际上使用它们。

最简单的方法是创建一个库初始化函数,该函数引用您不希望被剥离的确切符号。这是精确的,并且可以节省使用链接器命令行选项进行摔跤的负担,这可以使您免受(不太可能的)工具行为变化的影响。

框架具有自动初始化程序(非常方便),可以在运行时加载框架时自动调用,只需在初始化任何静态变量之后。

__attribute__((constructor))
static void MyModuleInitializer()
{
    static BOOL initialized = NO;
    if (!initialized) {

        // References to symbols that should be kept around.

        initialized = YES;
    }
}

只是为了咧嘴笑,使用__attribute__((destructor))装饰器也支持自动终结器。