【问题标题】:why does gcc linker choose older version of shared lib?为什么 gcc 链接器选择旧版本的共享库?
【发布时间】:2011-04-28 15:23:27
【问题描述】:

我很困惑。我在 /lib 中有 2 个版本的 libssl.so: /lib/libssl.so.4/lib/libssl.so.6

这是一个精简的最小示例——我将“无”与 libssl 链接——结果是它链接到libssl.so.4。这是什么决定的?

 $ g++ -o foo.so -shared -lssl

 $ ldd foo.so |grep ssl
 libssl.so.4 => /lib/libssl.so.4 (0xf7f04000)

【问题讨论】:

  • /lib/libssl.so/usr/lib/libssl.so 是指向 /lib/libssl.so.4 的符号链接吗?另请参阅this question
  • 是的,你是对的,/usr/lib/libssl.so 是 /lib/libssl.so.4 的符号链接(实际上是 /lib/libssl.so.4 的真实文件)本身就是一个符号链接。)重新指向解决了这个问题。

标签: c++ linker


【解决方案1】:

选项-lssl 指示链接器查找名为libssl.solibssl.a 的文件。如果您只有libssl.so.4libssl.so.6,那么您将遇到链接器错误。

在库目录中的某个位置(可能在 /lib 中)查找名为“libssl.so”的符号链接。

【讨论】:

  • 谢谢,我应该意识到这一点。让我感到震惊的是,我希望 libssl.so 符号链接与实际文件(即 /lib)位于同一目录中,但它实际上位于 /usr/lib 中,当然指向 .so.4 版本在 /lib.重新指出它是解决方案。
【解决方案2】:

选项-lssl 查找linker 库名称,在这种情况下为libssl.so。通常 libssl.so 将是指向 soname 库或 real 名称库的符号链接,其中实际链接已完成。您应该将 libssl.so 符号链接重新指向使用 lib 的正确版本。

有关共享实验室命名的更多信息,您可以阅读here

【讨论】:

  • 谢谢,这完全正确。我想将这个和@Cubbi 都标记为选定的答案,但我必须选择一个。
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多