2014-06-29 83 views
11

我试图编译来自Caffe(http://caffe.berkeleyvision.org/installation.html),我得到了以下错误:的Ubuntu 12.04:LD找不到库

/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找不到这些库? 谢谢。

回答

10

TL;博士:Caffe makefile文件会在/usr/liblibblas.so。如果缺失,update-alternatives会在安装它的位置创建一个符号链接/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/中。通常存在符号链接/usr/lib/libblas.so,并指向共享库的真实位置。出于某种原因,在初始配置中情况并非如此。

当处理多种包装替代品时,update-alternatives派上用场。在libblas.so的情况下,您可以轻松切换您可能已安装的多个实现(libblas,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. 

同样的推理适用于libcblas.so

5

原来我不得不跑

sudo update-alternatives --config libblas.so 
sudo update-alternatives --config liblapack.so 

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

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-base的。希望这可以帮助!

+0

This Works!谢谢 – mcExchange