我正在尝试编译 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.so
。 LD_LIBRARY_PATH
用于运行时,与此无关。
LD_LIBRARY_PATH
在编译时并不能真正帮助您。它只提供目录以在执行依赖它们的程序时查找共享库,在它们被编译之后。不过,在编译过程中进行链接时,编译器需要找到这些共享库,并且通过 LD_LIBRARY_PATH
以外的其他方式进行查找。
更重要的是:如果使用 gcc
或 clang
进行编译,则使用 -L< 提供要在其中查找要链接的库的目录
标志,它不考虑 LD_LIBRARY_PATH
环境变量。
libblas.so
的常见位置是 /usr/lib/atlas-base/
和 /usr/lib/libblas/
。 caffe
的 Makefile
没有做任何特别的事情来尝试定位这些子目录,而是依赖于这些库位于默认库目录 /usr/lib/
。通常存在符号链接(symbolic link) /usr/lib/libblas.so
,并指向共享库的真实位置。出于某种原因,您的初始配置并非如此。
在处理包的多个替代方案时,update-alternatives
就派上用场了。在 libblas.so
的情况下,它让您可以轻松地在您可能已安装的多个实现(libblas
、openblas
)之间切换,并通过更改符号链接(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/