【问题标题】:Issue with using shared libraries in C++ projects在 C++ 项目中使用共享库的问题
【发布时间】:2014-01-03 00:45:09
【问题描述】:

我正在尝试更改 MongoDB 的源代码并使用外部库中的函数。我已经能够更改构建脚本(SCons 文件)并强制编译器与我要使用的库进行额外的链接。虽然在编译源代码和链接目标文件时我没有遇到任何问题,但在启动 mongod 时我遇到了一个奇怪的错误。这是我收到的消息(就在 mongod 进程终止之前):

./mongod: error while loading shared libraries: .1: cannot open shared object file: No such file or directory

我能够通过将库的 .so 文件移动到 /lib/x86_64-linux-gnu 并将其重命名为 .1 来解决此问题,这是 mongod 期望找到的路径共享库。我不知道这个问题的原因是什么,但是对于其他库,例如 pthread,一切都很好。这个问题有什么具体的解决方案吗?换句话说,我应该怎么做才能使可执行程序使用正确的命名(不是.1)在其他位置查找库文件?

这是 LD_DEBUG=all mongod 时的输出:

  4564: 
  4564: file=libpthread.so.0 [0];  needed by ./mongod [0]
  4564: find library=libpthread.so.0 [0]; searching
  4564:  search cache=/etc/ld.so.cache
  4564:   trying file=/lib/x86_64-linux-gnu/libpthread.so.0
  4564: 
  4564: file=libpthread.so.0 [0];  generating link map
  4564:   dynamic: 0x00007f6ddccb7d50  base: 0x00007f6ddcaa0000   size: 0x000000000021c448
  4564:     entry: 0x00007f6ddcaa6cf0  phdr: 0x00007f6ddcaa0040  phnum:                  9
  4564: 
  4564: 
  4564: file=.1 [0];  needed by ./mongod [0]
  4564: find library=.1 [0]; searching
  4564:  search cache=/etc/ld.so.cache
  4564:   trying file=/lib/x86_64-linux-gnu/.1
  4564:  search path=/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/x86_64:/lib/tls:/lib/x86_64:/lib:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/x86_64:/usr/lib        (system search path)
  4564:   trying file=/lib/x86_64-linux-gnu/tls/x86_64/.1
  4564:   trying file=/lib/x86_64-linux-gnu/tls/.1
  4564:   trying file=/lib/x86_64-linux-gnu/x86_64/.1
  4564:   trying file=/lib/x86_64-linux-gnu/.1
  4564:   trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/.1
  4564:   trying file=/usr/lib/x86_64-linux-gnu/tls/.1
  4564:   trying file=/usr/lib/x86_64-linux-gnu/x86_64/.1
  4564:   trying file=/usr/lib/x86_64-linux-gnu/.1
  4564:   trying file=/lib/tls/x86_64/.1
  4564:   trying file=/lib/tls/.1
  4564:   trying file=/lib/x86_64/.1
  4564:   trying file=/lib/.1
  4564:   trying file=/usr/lib/tls/x86_64/.1
  4564:   trying file=/usr/lib/tls/.1
  4564:   trying file=/usr/lib/x86_64/.1
  4564:   trying file=/usr/lib/.1
  4564: 
  ./mongod: error while loading shared libraries: .1: cannot open shared object file: No such file or directory

【问题讨论】:

    标签: c++ c mongodb gcc shared-libraries


    【解决方案1】:

    我以某种方式找到了解决问题的方法。认为它可能对其他人也有帮助。

    基本上,当您使用 ma​​ke 创建共享库时,您应该定义 .so 文件名。这是我的情况,我只是将其设置为适当的值,现在一切正常,至少我已经修复了这个错误。

    在 Google 中查找,我发现 gcc-soname 选项就是为此而设计的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      相关资源
      最近更新 更多