ubuntu18.04 + cuda9+cudnnv7.5+gtx1060 。换了台新电脑,欣喜的配置深度学习环境,奈何问题频出阿!!!
在配置caffe make all 的时候出现这个问题:
build_release/lib/libcaffe.so:对‘google::base::CheckOpMessageBuilder::NewString()’未定义的引用
.build_release/lib/libcaffe.so:对‘leveldb::Status::ToString() const’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:625: recipe for target '.build_release/tools/upgrade_net_proto_text.bin' failed
make: *** [.build_release/tools/upgrade_net_proto_text.bin] Error 1
make: *** 正在等待未完成的任务....
.build_release/tools/extract_features.o:在函数‘std::string* google::MakeCheckOpString<int, int>(int const&, int const&, char const*)’中:
extract_features.cpp:(.text._ZN6google17MakeCheckOpStringIiiEEPSsRKT_RKT0_PKc[_ZN6google17MakeCheckOpStringIiiEEPSsRKT_RKT0_PKc]+0x50):对‘google::base::CheckOpMessageBuilder::NewString()’未定义的引用
.build_release/tools/extract_features.o:在函数‘std::string* google::MakeCheckOpString<unsigned long, unsigned long>(unsigned long const&, unsigned long const&, char const*)’中:
extract_features.cpp:(.text._ZN6google17MakeCheckOpStringImmEEPSsRKT_RKT0_PKc[_ZN6google17MakeCheckOpStringImmEEPSsRKT_RKT0_PKc]+0x51):对‘google::base::CheckOpMessageBuilder::NewString()’未定义的引用
.build_release/lib/libcaffe.so:对‘leveldb::DB::Open(leveldb::Options const&, std::string const&, leveldb::DB**)’未定义的引用
.build_release/lib/libcaffe.so:对‘leveldb::Status::ToString() const’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:625: recipe for target '.build_release/tools/extract_features.bin' failed
make: *** [.build_release/tools/extract_features.bin] Error 1
.build_release/lib/libcaffe.so:对‘leveldb::DB::Open(leveldb::Options const&, std::string const&, leveldb::DB**)’未定义的引用
.build_release/lib/libcaffe.so:对‘google::base::CheckOpMessageBuilder::NewString()’未定义的引用
.build_release/lib/libcaffe.so:对‘leveldb::Status::ToString() const’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:625: recipe for target '.build_release/tools/upgrade_solver_proto_text.bin' failed
make: *** [.build_release/tools/upgrade_solver_proto_text.bin] Error 1
.build_release/lib/libcaffe.so:对‘leveldb::DB::Open(leveldb::Options const&, std::string const&, leveldb::DB**)’未定义的引用
.build_release/lib/libcaffe.so:对‘google::base::CheckOpMessageBuilder::NewString()’未定义的引用
.build_release/lib/libcaffe.so:对‘leveldb::Status::ToString() const’未定义的引用
collect2: error: ld returned 1 exit status
上述博客说是由于protobuf的版本不对导致的,caffe能正确使用的是protobuf-2.6.1版本,而自带的版本是3.4.然后我把版本降低到2.5后,probuf 2.5下载 。发现仍然报错。
经过一番折腾后,终于解决。
首先,前面安装probuf 的时候使用的gcc版本是4.9,后面重新升级gcc版本后,相应的probuf 并没有发生重新编译,导致 make all 的时候会出现乱码。
所以先卸载probuf ,
sudo apt-get remove libprotobuf-dev
如果以前有安装过的话,使用make clean清理一下原来的版本。
which protoc
运行完“which protoc”会显示一个protoc的路径,如果没有显示则下面这条命令不必执行
sudo rm /usr/local/bin/protoc
具体路径以“which protoc”显示的为准
到此,低版本的protobuf卸载完成。
然后查看 gcc 版本。gcc 的版本要大于5,如果gcc的版本小于5,则重新链接。通过下面的命令。改好之后可以再查看,看gcc的版本是不是5
gcc -v
sudo ln -s /usr/bin/gcc-5 /usr/bin/gcc -f
sudo ln -s /usr/bin/g++-5 /usr/bin/g++ -f
进入到克隆的protobuf目录
cd protobuf
./autogen.sh
./configure
make
// 如果没有克隆子模块,make check会失败但是可以继续make install,但是使用某些功能时可能会出错
make check
sudo make install
sudo ldconfig
// 输出protobuf版本信息则表示安装成功
protoc --version
官网写了,默认会安装到/usr/local路径下,但是/usr/local/lib不一定是系统路径LD_LIBRARY_PATH的一部分,因而或者将/usr/local/lib增加到系统路径LD_LIBRARY_PATH,或者指定安装路径。最好的就是指定安装到/usr路径(此时由于拷贝lib文件夹,实际上安装到/usr/lib路径),如下命令:
./configure --prefix=/usr (我用的这个命令)
或者打开~/.profile # 打开配置文件在文件最后添加:
sudo gedit ~/.profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
whereis protoc #查看那些路径下安装了protobuf caffe 要求的版本是2开头的
which protoc #查看默认选用的protobuf
protoc --version #查看当前默认的protobuf的版本
sudo protoc --version #查看系统的protobuf的版本
然后再查看probuf的版本,这个时候是使用gcc 5.x的版本重新安装的probuf。安装结束后,重新进行编译。
首先
make clean
sudo make all -j8
通过这个修改这次可以编译通过了。谢天谢地。