Ubuntu 12.04:ld无法找到库

13

我正在尝试编译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找不到这些库呢? 谢谢。

4个回答

11

tl;dr: 当使用Caffe编译时,makefile会在/usr/lib中查找libblas.so。 如果缺少,则update-alternatives将创建一个符号链接/usr/lib/libblas.so,指向其安装位置的实际文件。对于libcblas.so同样适用。 LD_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/中。通常情况下,一个符号链接/usr/lib/libblas.so存在,并指向共享库的实际位置。由于某种原因,在您的初始配置中并非如此。

当处理多个包的替代品时,可以使用update-alternatives。在libblas.so的情况下,它使您可以轻松地在安装了多个实现(libblasopenblas)之间切换,并通过更改符号链接来实现。

当缺少该符号链接时,sudo update-alternatives --config libblas.so将创建该符号链接,从而使编译器能够找到共享库,并解决问题。 这可以通过命令输出来指示:

 $ 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


6
原来我需要运行。
sudo update-alternatives --config libblas.so
sudo update-alternatives --config liblapack.so

选择libatlas。 我不知道为什么。如果有人能解释给我听,我会给他答案。 谢谢。

6

4
作为对@Ran答案的补充,Ubuntu在所需的Caffe软件包结构方面有一些奇怪的问题。我刚刚在自己的机器上解决了这个问题,并在这里提供一些帮助以供其他人参考(Ubuntu 14.04)。 libatlas-dev不需要依赖于libatlas-base-dev! Caffe似乎只喜欢后者的库。请安装它。
然后,运行@Ran建议的命令,并从/usr/lib下的atlas-base目录中选择库。只安装了libatlas-dev,update-alternatives将在@swalog的帖子底部输出,但实际上没有链接caffe认可的atlas库!它需要来自atlas-base的库。希望这可以帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接