0

当我用 制作我的程序时-larmadillo,我得到一个需要两个版本的可执行文件:

$ ldd ./a.out | grep armadillo 
$ libarmadillo.so.7 => /usr/lib/x86_64-linux-gnu/libarmadillo.so.7 (0x00007fd5e29a0000)
$ libarmadillo.so.4 => not found

谁能指出我正确的方向?这对我来说没有任何意义!

背景:我最初通过 安装了 libarmadillo sudo apt-get install libarmadillo-dev,然后我意识到我需要使用特定参数(启用 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,我觉得这很奇怪。

4

2 回答 2

0

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

我重新安装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能够做到这一点?

于 2016-08-17T14:32:39.730 回答
-1

有时linux会为一个动态库创建许多符号链接。我不知道为什么,但没关系,因为没有不方便。因此,您可以像这样创建一个新的符号链接:ln -s path_to_my_so_lib/my_lib.so /usr/lib/x86_64-linux-gnu/libarmadillo.so.4

于 2016-08-17T14:18:28.403 回答