当我包含一个共享库时,我的可执行文件正在寻找它的两个版本
When I include a shared library, my executable is looking for two versions of it
当我用-larmadillo
制作程序时,我得到一个可执行文件,它需要两个版本:
$ ldd ./a.out | grep armadillo
$ libarmadillo.so.7 => /usr/lib/x86_64-linux-gnu/libarmadillo.so.7 (0x00007fd5e29a0000)
$ libarmadillo.so.4 => not found
谁能给我指个正确的方向?这对我来说毫无意义!背景:我最初通过sudo apt-get install libarmadillo-dev
安装libarmadillo,然后我意识到我需要用一个特定的参数(64位字启用)来构建它,所以我通过sudo apt-get remove libarmadillo-dev
卸载它,然后下载最新版本,配置和make/make安装它。大概我的系统上只有一个版本的libarmadillo——在通常的地方我没有看到任何旧的库。
My Makefile is:
CC= g++
CFLAGS= -Lcontrib/armadillo-7.400.1 -L/usr/include -Lcontrib/mlpack-2.0.1/build/lib -fpermissive -std=c++11 -O0 -g -Wall
LDFLAGS= -lmlpack -larmadillo
ldd的详细输出很有趣,我认为?
$ ldd -v ./a.out | grep armadillo
$ libarmadillo.so.7 => /usr/lib/x86_64-linux-gnu/libarmadillo.so.7 (0x00007fd5e29a0000)
$ libarmadillo.so.4 => not found
$ /usr/lib/x86_64-linux-gnu/libarmadillo.so.7:
后一节(列出libarmadillo.so.7的依赖项)是:
/usr/lib/x86_64-linux-gnu/libarmadillo.so.7:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
没有提到"丢失的"libarmadillo.so。
我想我已经弄明白了,但是结果不是特别令人欣慰。
我将有依赖的mlpack
重新安装到libarmadillo
中,然后重新构建,对libarmadillo.so.4
的需求消失了。
我认为发生的过程是:
- 安装
libarmadillo
的旧版本 - 已安装的
libmlpack
配置旧版本 - 意识到我需要一个新版本的
libarmadillo
,所以卸载了旧的libarmadillo
并安装了一个新的。 - 使用cmake/make 重建mlpack,但没有使用
make install
- 生成我的可执行文件
- 现在有一个可执行文件,它指向
mlpack
,需要旧的libarmadillo
,但它也指向新的libarmadillo
一旦我make install
重建的mlpack
,我的问题就消失了。我很惊讶ldd
的详细输出没有标记任何原因为什么它正在寻找libarmadillo.so.4
(即libmlpack
依赖于旧库)- ldd
应该能够做到这一点吗?
有时linux会创建一个动态库的多个符号链接。我不知道为什么,但无论如何,没有不便。因此,您可以像这样创建一个新的符号链接:ln -s path_to_my_so_lib/my_lib。所以/usr/lib/x86_64-linux-gnu/libarmadillo.so.4
相关文章:
- QT在错误的班级中寻找空位
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 正在寻找C++不可变的hashset/hashmap
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 用符号版本替换对函数的所有调用
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 我需要分发哪些版本的可再分发文件
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 在运行时读取 libstdc++ 版本
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- Vulkan SDK 版本 1.1.85.0 在 Kubuntu 18.10 上链接
- 寻找地理和伤害意味着超载
- 在C++阵列快速SIMD版本中寻找短值
- 当我包含一个共享库时,我的可执行文件正在寻找它的两个版本