【问题标题】:How do you link to a specific version of a shared library in GCC如何链接到 GCC 中特定版本的共享库
【发布时间】:2010-10-24 02:31:18
【问题描述】:

我正在编译一些在 Debian Linux 系统上使用 libcurl 的代码。我的开发机器正在运行 Debian 5,但我希望二进制文件也可以在旧的 Debian 4 系统上使用。

我发现如果我指定 -lcurl 它将链接到 libcurl.so.4 但 Debian 4 系统只有 libcurl.so.3

有什么方法可以告诉 GCC 链接到 libcurl.so.3(在 Debian 4 和 5 中都存在)或 libcurl.so,以便它使用任何可用的版本?

【问题讨论】:

  • 在旧的 Debian 上, libcurl.so 不是 libcurl.so.3 的符号链接吗?我的意思是,默认情况下 -lcurl 并不正确,这看起来很奇怪。
  • kastauyra:版本不兼容,或者至少不能假定为二进制兼容。因此,当您链接它时,它会在二进制文件中记录链接的主要版本:如果您在较新的系统上编译,它将需要版本 4,而不能在旧系统上工作。 (实际上它记录的是soname,它是存储在库文件中的字符串,通常但不一定是“libcurl.so.3”)

标签: linux gcc linker debian


【解决方案1】:

不要使用“-lcurl”,而是使用“-l:libcurl.so.3” 当然也可以使用“-L _installed_pa​​th_”

【讨论】:

  • 符号链接时同样的问题。 -l:libX.so 链接到 libX.so.Y
  • 即使使用 rpath,这对我也不起作用。 ldd 显示它与一件事相关联。链接的输出显示正确的文件名。但 strace 确认它正在加载 file.2 而不是 file.2.3 并且它不是符号链接。
  • 我很想将此标记为答案。你真的救了我@engineer.udays
  • 由于某种原因它对我不起作用,即使我用实际文件替换符号链接并删除它仍然链接到特定版本的所有其他库,它可能来自 SONAME
【解决方案2】:

您可以在链接器命令行上传递实际的 .so 文件而不是 -l,它应该做您想做的事情。

【讨论】:

  • 啊,除了 libcurl.so 只是 Debian 上的 lubcurl.so.4 的符号链接,它仍然链接到 libcurl.so.4 之外,这几乎可以工作。
  • 我会将其标记为已接受的答案,尽管它对于 Debian 5 上的 libcurl 并不完全正确。我最终做的是从 Debian 4 系统获取 libcurl.so.3 的副本并链接通过指定 bdonlan 建议的 .so 文件名直接到那个位置。
【解决方案3】:

如何在您的项目本地创建一个链接到 .3 的符号链接,然后您可以在编译时使用 -L。我不确定您是否会遇到名称冲突,但您始终可以将其称为 libcurl-old.so,以防万一。

【讨论】:

    【解决方案4】:

    我认为正确的做法是使用链接器的--filter--auxiliary 标志。

    它们的文档记录不多,但应该允许您根据安装的机器从同一库的不同版本中加载符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 2013-01-13
      相关资源
      最近更新 更多