linux - Ubuntu 12.04 : ld cannot find library

标签 linux ubuntu ubuntu-12.04 ld

我正在尝试编译 Caffe ( http://caffe.berkeleyvision.org/installation.html ),但出现以下错误:

/usr/bin/ld: cannot find -lcblas
/usr/bin/ld: cannot find -latlas

但是,我安装了这些库 (libatlas)。 我的 LD_LIBRARY_PATH 包含路径/usr/lib/atlas-base,它包含文件 libcblas.so 和 libatlas.so(以及其他一些文件)。

为什么 ld 找不到这些库? 谢谢。

最佳答案

tl;dr: Caffe makefile 在 /usr/lib 中查找 libblas.so。如果丢失,update-alternatives 会创建一个指向其安装位置的符号链接(symbolic link) /usr/lib/libblas.so。这同样适用于 libcblas.soLD_LIBRARY_PATH 用于运行时,与此无关。


LD_LIBRARY_PATH 在编译时并不能真正帮助您。它只提供目录以在执行依赖它们的程序时查找共享库,它们被编译之后。不过,在编译过程中进行链接时,编译器需要找到这些共享库,并且通过 LD_LIBRARY_PATH 以外的其他方式进行查找。

更重要的是:如果使用 gccclang 进行编译,则使用 -L< 提供要在其中查找要链接的库的目录 标志,它不考虑 LD_LIBRARY_PATH 环境变量。

libblas.so 的常见位置是 /usr/lib/atlas-base//usr/lib/libblas/caffeMakefile 没有做任何特别的事情来尝试定位这些子目录,而是依赖于这些库位于默认库目录 /usr/lib/。通常存在符号链接(symbolic link) /usr/lib/libblas.so,并指向共享库的真实位置。出于某种原因,您的初始配置并非如此。

在处理包的多个替代方案时,update-alternatives 就派上用场了。在 libblas.so 的情况下,它让您可以轻松地在您可能已安装的多个实现(libblasopenblas)之间切换,并通过更改符号链接(symbolic link)。

sudo update-alternatives --config libblas.so 在它丢失时创建了这个符号链接(symbolic link),这反过来让编译器找到共享库,解决了你的问题。这由命令的输出指示:

 $ sudo update-alternatives --config libblas.so
There is only one alternative in link group libblas.so (providing /usr/lib/libblas.so): /usr/lib/libblas/libblas.so
Nothing to configure.

同样的推理适用于 libcblas.so

关于linux - Ubuntu 12.04 : ld cannot find library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24479060/

相关文章:

java - 无法使用java从linux系统读取文件

Linux - 加入 2 个 CSV 文件

php - 无法在 FPDF 中添加字体

ruby-on-rails - Linux 上新 Rails 部署的最佳实践?

linux - 在 Ubuntu 14.04 上安装 Haskell 用于 Web 开发

ubuntu - 为什么没有 Vim 插件在 Ubuntu 20.04 上工作?

c++ - avcodec_open 段错误

ubuntu - VisualWorks 7.9.1 Ubuntu 12.04

linux - Windows xp 上的 shell 脚本

linux - 有没有办法知道 Linux 中的初始化脚本存储在哪里?