【问题标题】:Linking against multiple shared libraries that all linked against a common static library链接到多个共享库,这些共享库都链接到一个公共静态库
【发布时间】:2011-01-25 02:52:06
【问题描述】:

假设您有 2 个共享库 lib1.so 和 lib2.so,它们都有 libcommon.a 静态链接。如果要动态链接 lib1.so 和 lib2.so,编译器会抱怨符号引用不明确吗?或者编译器是否足够聪明,可以知道 libcommon 符号在 lib1 和 lib2 之间共享,并允许您动态链接两者?

【问题讨论】:

    标签: c linux linker


    【解决方案1】:

    不会发生冲突,因为当您链接到共享库时,链接器将使用第一个提供符号的共享库中的定义,而不会进一步查看其他共享库。 .a 中包含的符号将在两个共享库中导出,但不会冲突。

    【讨论】:

    • 这不是真的。有弱导出符号和强。如果strong之间有歧义,则表示错误。
    【解决方案2】:

    静态库将用于在内部解析链接,但外部链接不会传播到共享库接口,因此不会发生冲突。每个共享库都将包含它自己的静态库代码副本。

    【讨论】:

    • 至少在 GNU/Linux 下,如果我创建一个链接到静态库 (.a) 的共享库 (.so),我可以访问从静态库中提取的任何符号一个只链接到共享(.so)库的可执行文件,所以我很确定静态库中的符号 传播到共享库的接口。也许在其他一些系统上的工作方式有所不同,但我工作过的大多数系统都是默认链接器选项的情况。
    • @Jay Walker:对于它的价值,我更喜欢你的回答。无论采用何种机制,基本事实是不会发生冲突。
    • @Clifford 我考虑过了。由于很多原因,我不会发布我的问题。我要删除我的评论。
    【解决方案3】:

    假设两个共享库链接到不同的静态库。但是静态库都包含一个同名的函数。会有冲突。

    我很确定,因为我有一个 tcl/tk 应用程序,它加载了两个 tcl 库 (.so)。这两个库都与 openssl 库静态链接。但有不同的版本。 运行 tcl 应用程序时发生分段错误。我将其追踪到openssl。新版本的功能实现有所改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多