V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
paparika
V2EX  ›  Linux

关于静态库依赖关系的困惑

  •  
  •   paparika · 2018-06-28 13:47:29 +08:00 · 3427 次点击
    这是一个创建于 2333 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现有一个进程,依赖 libcurl.so 。此进程要接入一个 sdk,sdk 也依赖 curl。如果使用 curl 的静态库编译一个静态库 sdk,sdk 集成到进程后会不会有问题。此时原进程的 curl 地址空间和 sdk 集成的 curl 的地址空间完全独立?

    5 条回复    2018-08-02 17:30:58 +08:00
    BOYPT
        1
    BOYPT  
       2018-06-28 14:07:03 +08:00   ❤️ 2
    得看 sdk 的编译参数;默认参数下应该是 sdk 用一套 libcurl,你的进程用一套 libcurl,两套 curl 独立;

    但是 sdk 编译时候用--whole-archive 静态链接 libcurl.a 的话,libcurl 的名空间可以全暴露出来,可以给你的进程链接,如果要避免这个情况可以用--no-whole-archive
    xiaoxuxu
        2
    xiaoxuxu  
       2018-06-29 13:18:12 +08:00   ❤️ 1
    一般来说两种方法:
    1. SDK 不要静态链 curl,链接 executable 的时候先链接 SDK,最后链接 libcurl.so ,这样整个进程使用同一份 libcurl 动态库;
    2. 编译 SDK 成动态库,同时静态链接 libcurl,但是将 libcurl 符号全部隐藏(使用 ld script 控制);最后链接 executable 时分别链接 SDK.solibcurl.so 。这样 SDK 当中使用的是自身静态链接的 curl,executable 其他部分使用的是动态链接的 libcurl.so ,不会冲突(前提是保证 SDK 中的 curl 的 symbol 全部隐藏);

    如果 SDK 必须编译成静态库,那么选择方法 1 是最方便的。如果必须使用两个版本的 libcurl,可以使用方法 2.
    paparika
        3
    paparika  
    OP
       2018-06-29 14:35:46 +08:00
    @xiaoxuxu 谢谢回复。请教另外一个问题,编一个动态库,它依赖另外一个静态库,那么此动态库是不是会直接包含静态库代码?编好之后外部直接引用动态库,与静态库不再发生联系吧
    iwtbauh
        4
    iwtbauh  
       2018-06-29 19:07:35 +08:00 via Android
    不要这样做,这会浪费大量内存。降低用户体验。
    尽量重用动态库,因为动态库实质上只有一份装入了内存,并使用写时复制技术保护。
    xiaoxuxu
        5
    xiaoxuxu  
       2018-08-02 17:30:58 +08:00
    @paparika 是的。生成动态库的时候,所依赖的静态库部分都编进去了。没用到的静态库部分不会编进去。如果需要把静态库的所有内容都强制放到动态库里,可以加上 whole-archive 选项。最终动态库的使用方肯定都不需要再用到这个静态库了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1404 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:50 · PVG 01:50 · LAX 09:50 · JFK 12:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.