我正在尝试编译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找不到这些库? 感谢。
答案 0 :(得分:11)
tl; dr: Caffe
makefile在libblas.so
中查找/usr/lib
。如果缺少,update-alternatives
会在其安装位置创建符号链接/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/
。 Makefile
的{{1}}没有做任何特别的事情来尝试找到这些子目录,并依赖于这些库位于默认库目录caffe
中。通常存在符号链接/usr/lib/
,并指向共享库的实际位置。出于某种原因,在初始配置中情况并非如此。
在处理包的多个替代方案时,/usr/lib/libblas.so
会派上用场。在update-alternatives
的情况下,您可以轻松地在您可能已安装的多个实施(libblas.so
,libblas
)之间切换,并通过更改符号链接来实现此目的。 / p>
openblas
在缺少时创建了这个符号链接,这反过来让编译器找到共享库,解决您的问题。这由命令的输出表示:
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.
。
答案 1 :(得分:6)
sudo apt-get install libatlas-base-dev
为我工作,它删除了两个缺少的依赖项。
答案 2 :(得分:5)
事实证明我必须运行
sudo update-alternatives --config libblas.so
sudo update-alternatives --config liblapack.so
并选择libatlas。 我不知道为什么,。如果有人能解释我,我会给他答案。 感谢。
答案 3 :(得分: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的那个。希望这有帮助!