ios - 在 iOS 静态库中打包一个 BIG C++ 项目 : dependencies, 剥离和隐藏

标签 ios dynamic static stripping

我们有一个巨大的代码库,其中包含多个依赖项(如 tinyxml、fft 等)、模板……在 C/C++ 中,所有这些都整齐地包装在一个非常简单的 C 接口(interface)后面。

为 OSX 构建一个动态库就好了,因为我们可以轻松地从库中删除所有不需要的符号(使用 strip -S -x)只留下想要的 C 接口(interface)并隐藏所有 C++ 类/模板/依赖项/...所以最后,唯一导出/可见的符号是我们的 API 调用:OUR_LIBNAME_FUNC1、OUR_LIBNAME_FUNC2 等

然而,我们现在想对 iOS 静态库做同样的事情,但我们的想法已经不多了。有没有办法隐藏所有不需要/想要的符号,而不会恢复到一大堆代码合并、重写代码、objdump-ing、混淆......?特别是对于可能被其他人重用的外部库,这将导致多个符号定义!

经过大量研究(主要是堆栈溢出:-))我有点绝望......

打招呼

最佳答案

好的,我只是花了很多时间做类似的事情。这是不完美的,但这对于我们的目的来说已经足够好了。

  • 将您的 C api 顶级入口点放在一个文件“c_api.c”中。
  • 创建一个文件“c_api.symbols”,其中每个入口点的名称位于一行
    本身带有链接器添加的“_”
  • 使用链接器将您的 api 预链接到您的内部库

  • 像这样的东西:
    % cat c_api.c
    #include "libA.h"
    #include "libB.h"
    #include "libC.h"
    
    void init()
    {
        libA_startup();
    }
    
    void run()
    {
        libB_execute(libA_context());
    }
    
    void stop()
    {
        libA_shutdown();
        libB_end();
        libC_log();
    }
    % cat c_api.symbols
    _init
    _run
    _stop
    % cc -c a_api.c
    % ld -x -r c_api.o libA.a libB.a libC.a -exported_symbols_list c_api.symbols -o c_api_hidden.o
    % ar r c_api.a c_api_hidden.o
    

    关于ios - 在 iOS 静态库中打包一个 BIG C++ 项目 : dependencies, 剥离和隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9802378/

    相关文章:

    c - 用 C 写 `eval()`

    c# - 是否可以查询 ExpandoObject 列表?

    javascript - 为 Sequelize 创建中间 BaseModel 类

    javascript - 在 iPad 网络应用程序中禁用垂直弹跳效果

    ios - 应用程序在 gpus_ReturnNotPermittedKillClient 崩溃

    ios - 如何在 Objective C 中异步加载数据 UITableview 滚动和核心数据获取

    python - django静态文件夹名称更改

    ios - 如何为具有动态宽度的 UIButtons 设置背景?

    javascript - Meteor 辅助函数在检索所有用户计数时出现异常

    java - 为什么我不能在接口(interface)中声明静态方法?