当我包含一个共享库时,我的可执行文件正在寻找它的两个版本

When I include a shared library, my executable is looking for two versions of it

本文关键字:寻找 版本 两个 可执行文件 共享 包含一 我的      更新时间:2023-10-16

当我用-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