在C++项目中使用共享库的问题
Issue with using shared libraries in C++ projects
我正在尝试更改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
我不知怎么找到了问题的解决方案。我觉得这可能对其他人也有帮助。
基本上,当您使用make创建共享库时,您应该定义.so文件名。这就是我的情况,我只是把它设置为一个合适的值,现在一切都正常了,至少我已经通过这样做修复了这个错误
在谷歌上查找,我发现gcc的-soname选项就是这样设计的
相关文章:
- 在 Android Studio 中使用 C++ 共享对象时出现问题
- 图问题:找出两个节点是否在每个节点的O(1)时间和O(2)存储中共享同一分支
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- 与 32 位共享对象的链接问题
- 提升线程问题,当一个线程与另一个线程没有相同的副本时如何共享变量?
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 在共享文件夹上恢复有效权利的问题
- 如何解决删除其他人之间共享的对象的问题
- 使用boost进程间库的phpexec共享内存和Cloudfoundry容器问题
- 使用命名共享内存的C++问题
- C++11 中 3 个线程和 2 个共享资源的同步问题
- JNI与共享对象有问题
- 在C++项目中使用共享库的问题
- 使用共享库编译问题
- 在linux上将boost静态链接到共享对象时出现问题
- C++:运行时将共享对象与主机应用程序链接,符号表问题
- 使用提升时出现问题,无法打开共享对象文件
- 仅检查共享库(例如 Apache 模块)中的内存问题
- 尝试安装和使用 LAPACK++,加载共享库时出现问题
- 具有共享QGLWidgets的线程OpenGL与Qt 5.1的问题