.build_release/lib/libcaffe.so:对‘google::base::CheckOpMessageBuilder::NewString()’未定义的引用

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

总之就是一堆关于google :probuf 的相关错误。这个问题https://blog.youkuaiyun.com/qq_33144323/article/details/81259985

上述博客说是由于protobuf的版本不对导致的,caffe能正确使用的是protobuf-2.6.1版本,而自带的版本是3.4.然后我把版本降低到2.5后,probuf 2.5下载   。发现仍然报错。

这篇博客说 https://blog.youkuaiyun.com/chenshuibiao/article/details/78734957 是因为gcc的版本问题。通过gcc -v 得知此时的版本是4.9 ,于是把版本升到5.5. 但是把gcc版本升级后仍然报错。

经过一番折腾后,终于解决。

首先,前面安装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

重头戏开始了,重新安装probuf。可以参考该连接

进入到克隆的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

通过这个修改这次可以编译通过了。谢天谢地。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值