几个常见caffe编译问题解决方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Anymake_ren/article/details/81331398

caffe编译问题

问题一:无法找到hdf5.h

make all步骤出现错误,找不到hdf5.h,而实际上我用了Anaconda明明安装了hdf5

./include/caffe/util/hdf5.hpp:6:18: fatal error: hdf5.h: No such file or directory

搜索到如下解决方案,原因是Ubuntu系统从15.04自带的hdf5名称和位置不一样了,所以要按照方法2修改配置,如果你不用Anaconda,那么可以用方法2,否则在Ubuntu15以后的版本上,用了会有后面GCC版本的问题,推荐方法1。实际上我使用的Anaconda明明安装了hdf5,所以针对这种情况,是头文件没有关联正确,使用方法1解决:

方法 1

在~/.bashrc里面添加如下链接库和头文件到对应路径即可

export LD_LIBRARY_PATH="~/anaconda2/lib:$LD_LIBRARY_PATH"
export LIBRARY_PATH="~/anaconda2/lib:$LIBRARY_PATH"
export C_INCLUDE_PATH="~/anaconda2/include:$C_INCLUDE_PATH"
export CPLUS_INCLUDE_PATH="~/anaconda2/include:$CPLUS_INCLUDE_PATH"

方法 2

Makefile.config文件的第85行,添加/usr/include/hdf5/serial/INCLUDE_DIRS,也就是把下面第一行代码改为第二行代码。

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/

Makefile文件的第173行,把 hdf5_hl 和hdf5修改为hdf5_serial_hlhdf5_serial,也就是把下面第一行代码改为第二行代码。

LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial

英文文档链接
https://gist.github.com/wangruohui/679b05fcd1466bb0937f

问题二:undefined reference to ‘google::protobuf::MessageLite::SerializeToString’

出现一堆undefined reference错误,总结原因如下:
1、系统中有多版本的protobuf,版本不兼容
2、我的Ubuntu16.04系统gcc是5.x,同时安装的gcc默认是4.x,编译caffe时4.x的gcc编成的库和系统的5.x的库不兼容。

build/lib/libcaffe.a(caffe.pb.o): In function `caffe::protobuf_AssignDesc_caffe_2fproto_2fcaffe_2eproto()':
/home/work/cdc/CDC/build/src/caffe/proto/caffe.pb.cc:118: undefined reference to `google::protobuf::DescriptorPool::FindFileByName(std::string const&) const'
build/lib/libcaffe.a(caffe.pb.o): In function `caffe::protobuf_AddDesc_caffe_2fproto_2fcaffe_2eproto()':
/home/work/cdc/CDC/build/src/caffe/proto/caffe.pb.cc:1018: undefined reference to `google::protobuf::MessageFactory::InternalRegisterGeneratedFile(char const*, void (*)(std::string const&))'
build/lib/libcaffe.a(caffe.pb.o): In function `caffe::VolumeDatum::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)':
/home/work/cdc/CDC/build/src/caffe/proto/caffe.pb.cc:1997: undefined reference to `google::protobuf::internal::WireFormatLite::ReadBytes(google::protobuf::io::CodedInputStream*, std::string*)'

解决方法:
1、使用anaconda安装合适版本的protobuf,并按照方法1中设置好对应的头文件和库路径
2、在Makefile.config文件中使用如下命令指定编译器gcc的版本

#25行改为如下:
CUSTOM_CXX := /usr/bin/g++-5

补充材料:Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量

对所有用户有效在/etc/profile增加以下内容。只对当前用户有效在Home目录下的
.bashrc或.bash_profile里增加下面的内容:
(注意:等号前面不要加空格,否则可能出现 command not found)

#在PATH中找到可执行文件程序的路径。
export PATH =$PATH:$HOME/bin

#gcc找到头文件的路径
C_INCLUDE_PATH=/usr/include/libxml2:/MyLib
export C_INCLUDE_PATH

#g++找到头文件的路径
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib
export CPLUS_INCLUDE_PATH
 #找到动态链接库的路径
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib
export LD_LIBRARY_PATH

#找到静态库的路径
LIBRARY_PATH=$LIBRARY_PATH:/MyLib
export LIBRARY_PATH

LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下:

LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):

export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH

LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):

export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH

举个例子,我们开发一个程序,经常会需要使用某个或某些动态链接库,为了保证程序的可移植性,可以先将这些编译好的动态链接库放在自己指定的目录下,然后按照上述方式将这些目录加入到LD_LIBRARY_PATH环境变量中,这样自己的程序就可以动态链接后加载库文件运行了。

区别与使用:

开发时,设置LIBRARY_PATH,以便gcc能够找到编译时需要的动态链接库。

发布时,设置LD_LIBRARY_PATH,以便程序加载运行时能够自动找到需要的动态链接库。

猜你喜欢

转载自blog.csdn.net/Anymake_ren/article/details/81331398