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

时间:2016-08-17 13:46:26

标签: c++ build armadillo mlpack

当我使用-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 - 我没有在通常的地方看到任何旧库。

谢谢

编辑:

我的Makefile是:

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.4,我觉得很奇怪。

2 个答案:

答案 0 :(得分:0)

我想我已经弄清楚了,但结果并不是特别令人安慰。

我重新安装了mlpack libarmadillo,它依赖于libarmadillo.so.4,然后重建,libarmadillo的要求消失了。

我认为发生的过程是我:

  • 安装旧版libmlpack
  • 已安装libarmadillo配置了旧版本
  • 已实现我需要更新版本的libarmadillo,因此已卸载旧make install并安装了新版本。
  • 使用cmake / make 重建mlpack但没有mlpack
  • 制作我的可执行文件
  • 现在有一个指向libarmadillo的可执行文件,它需要旧的libarmadillo,但它也指向新的make install

重建mlpackldd,我的问题就消失了。令我感到惊讶的是,libarmadillo.so.4的详细输出没有说明为什么它正在寻找libmlpack的任何理由(即ldd存在依赖关系在旧图书馆上) - tsconfig.json能够做到这一点吗?

答案 1 :(得分:-1)

有时linux会创建一个动态库的许多符号链接。我不知道为什么,但无论如何都没有不便之处。所以,你可以像这样创建一个新的符号链接:ln -s path_to_my_so_lib / my_lib.so /usr/lib/x86_64-linux-gnu/libarmadillo.so.4