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

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

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

    现有一个进程,依赖 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     Solana     2423 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 10:19 PVG 18:19 LAX 03:19 JFK 06:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86