在xavier NX上编译caffe时遇到一些错误,简单记录一下,
目录
一:首先是缺少各种库,对于这种错误直接用下面这篇博客的笔记安装相应的依赖库即可。
二:无法读取cudnn版本
三:找不到opencv
四:CUDA_cublas_device_LIBRARY (ADVANCED) linked by target "caffe" in directory /data/software/caffe_gcs/src/caffe
五: protoc版本不对
下面这篇博客里面记录了boost glog gflag lmdb hdf5 leveldb openmpi等依赖库的安装。
https://www.cnblogs.com/cumtchw/p/13064158.html
在cmake/Cuda.cmake里面有检测cudnn版本的代码,就是通过检测use/include里面的cudnn.h里面的内容去检测,你这个错误的原因是你usr/cudnn里面的cudnn.h文件不对,另一个路径下是对的,把另一个路径下面的cudnn.h拷贝过来然后放到usr/include里面即可。,拷贝之前记得把原来的cudnn.h备份,这样如果拷贝过来错误还没解决,可以恢复到之前的状态。
cp /data/trt_test/aiot/prot2trt_v2/include/cudnn.h /usr/include/
这个就是下载opencv源码,然后重新编译就好了,
mkdir build # 创建编译的文件目录
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j8 #编译
sudo make install
cmake的时候注意把路径安装到/usr/local下面,这样就会自动找到opencv。
网上查上面这个错误,说是可能是因为cmake版本不对,cmake版本至少需要3.12,而我的cmake版本是3.10.2,于是首先卸载cmake,然后重新安装,但是发现重新安装的cmake版本是3.5.1,并不是3.12,不过自己还是cmake ..试了下,发现cmake通过了。
/data/software/caffe_gcs/include/caffe/proto/caffe.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is
#error This file was generated by a newer version of protoc which is
^~~~~
/data/software/caffe_gcs/include/caffe/proto/caffe.pb.h:13:2: error: #error incompatible with your Protocol Buffer headers. Please update
#error incompatible with your Protocol Buffer headers. Please update
^~~~~
/data/software/caffe_gcs/include/caffe/proto/caffe.pb.h:14:2: error: #error your headers.
#error your headers.
^~~~~
/data/software/caffe_gcs/include/caffe/proto/caffe.pb.h:22:10: fatal error: google/protobuf/arena.h: No such file or directory
#include
^~~~~~~~~~~~~~~~~~~~~~~~~
出现上述错误之后,在网上查,都是说要安装protoc 的3.6.1版本,但是我的xavier里面现在的就是3.6.1版本的,
然后自己看错误提示是说自己现在安装的版本太久了,要安装个新版本的,于是首先卸载掉之前的旧版本,使用如下命令卸载
sudo apt-get remove libprotobuf-dev protobuf-compiler
然后下载安装新版本的protobuf
wget https://github.com/protocolbuffers/protobuf/archive/v3.8.0.tar.gz
tar -xzvf v3.8.0.tar.gz
cd protobuf-3.8.0
./autogen.sh
./configure
make
sudo make install
sudo ldconfig
export PATH=$PATH:/usr/local/protobuf/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib
然后再次编译,发现
/data/software/caffe_gcs/include/caffe/proto/caffe.pb.h:17:2: error: #error This file was generated by an older version of protoc which is
#error This file was generated by an older version of protoc which is
^~~~~
/data/software/caffe_gcs/include/caffe/proto/caffe.pb.h:18:2: error: #error incompatible with your Protocol Buffer headers. Please
#error incompatible with your Protocol Buffer headers. Please
这次的错误和之前相反了,这次是版本又太新了。。。。。无语。
于是要重新安装,我看了另一块xavier板子上的protobuf是3.0.0版本的,另外也在网上曾经搜到过这样的回答
This error usually happens when the protocol compiler (protoc) and the library header (/usr/include/google/protobuf) are inconsistent.
When you are using the protoc installed with apt-get, it should be installed in /usr/bin.
% which protoc
/usr/bin/protoc
% /usr/bin/protoc --version
libprotoc 3.0.0
% grep GOOGLE_PROTOBUF_VERSION /usr/include/google/protobuf/stubs/common.h
#define GOOGLE_PROTOBUF_VERSION 300000
于是装一个3.0.0试试看,但是要首先把源码安装的3.8.0卸载掉,在刚才的编译目录下执行,
make uninstall
然后用下面的方法安装proto3.0.0,
wget https://github.com/google/protobuf/archive/v3.0.0.zip
解压后,在v3.0.0版本中的autogen.sh中,需要下载gmock的1.7.0版本。因为有时候网速的问题,在这里我们先把他给下好,然后在autogen.sh中把下载这段代码给注释掉。
git clone https://github.com/paulsapps/gmock-1.7.0
然后改名为:
mv gmock-1.7.0 gmock
并且复制到protobuf目录下。
打开autogen.sh,然后将下面的内容注释掉。
if test ! -e gmock; then
echo "Google Mock not present. Fetching gmock-1.7.0 from the web..."
curl $curlopts -O https://googlemock.googlecode.com/files/gmock-1.7.0.zip
unzip -q gmock-1.7.0.zip
rm gmock-1.7.0.zip
mv gmock-1.7.0 gmock
fi
然后执行如下操作
./autogen.sh
./configure
make
make check #执行这个命令可能会有错误,不影响,可以继续make install,或者这行命令就直接不执行了,直接执行下面的make install
make install
1、创建文件 /etc/ld.so.conf.d/libprotobuf.conf 包含内容:
/usr/local/lib
2、sudo ldconfig
这时,再运行protoc --version 就可以正常看到版本号了