caffe问题记录
一段时间没用caffe跑模型, 训练的时候报错.
Error:…/caffe/python/caffe/_caffe.so:undefined symbol: ZN5caffe3NetIfEC1ERKSsNS_5PhaseEPKS1
查了查遇到同样问题的人也比较少, 找到stack的这个链接比较有用:Link
解决方法翻译过来就是:
目录caffe-rc3/build/lib不在查找动态加载器(加载动态库)的标准库搜索路径中.
这个问题基本上有四种解决方案:
1.将库(和头文件)安装到系统目录中, 系统加载程序查找库,然后重新编译.
2.编辑/etc/ld.so.conf , 将目录caffe-rc3/build/lib加到程序查找的路径中, 然后执
行ldconfig.
3.修改环境变量LD_LIBRARY_PATH, 使包含caffe-rc3/build/lib , 很少有人推荐这个解决方案.
4.修改构建命令, 以便链接器将正确的路径嵌入到可执行文件中的库中. 这必须通过在链接器命令行中添加-Wl,-rpath,caffe-rc3/build/lib来完成, 在IDE-Eclipse项目设置中设置.
1,4两条适用于IDE, 所以尝试了2,3方法, 并没有解决问题.
无果后决定重编译caffe(…hhhh)
make all 和make test没问题, 结果make runtest时又报了这个问题:
.build_release/tools/caffe:undefined symbol:
ZN5caffe3NetIfEC1ERKSsNS_5PhaseEPKS1
这是在生成caffe的可执行bin文件时出错, 于是在此目录下查看了caffe内调用的动态链接, 结果类似如下:
~/caffe/.build_release/tools$ ldd -r caffe
linux-vdso.so.1 (0x00007ffff7752000)
libcaffe.so.1.0.0 => …/caffe/.build_release/tools/./…/lib/libcaffe.so.1.0.0 (0x00007f67c657c000)
libcudart.so.10.0 => /usr/local/cuda/lib64/libcudart.so.10.0 (0x00007f67c6302000)
libglog.so.0 => /usr/lib/x86_64-linux-gnu/libglog.so.0 (0x00007f67c60d1000)
libgflags.so.2.2 => /usr/lib/x86_64-linux-gnu/libgflags.so.2.2 (0x00007f67c5eac000)
libprotobuf.so.10 => /usr/lib/x86_64-linux-gnu/libprotobuf.so.10 (0x00007f67c5a53000)
没有截图记录, 当时第二行的信息是
libcaffe.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcaffe.so.1.0.0
???caffe从全局的lib库里调用了libcaffe.so.1.0.0, 查看了/usr/lib/x86_64-linux-gnu/下果然有一个libcaffe.so.1.0.0, 把它用权限删除,再次make runtest, 成功.
侧面验证了上面的stack回答里的原因总结:目录caffe-rc3/build/lib不在查找动态加载器(加载动态库)的标准库搜索路径中.
由于全局库中不知道哪里来的一个libcaffe, 调用caffe时没找到caffe/build/lib的正确路径下, 而是优先找到了全局库/usr/lib/x86_64-linux-gnu/, 并且没有权限调用, 因此报错undefined symbol.