我是ubuntu 14.04, matlab 2014a 来运行faster-rcnn的,运行时会报错误:
ibprotobuf ERROR google/protobuf/descriptor_database.cc:57] File already exists in database: foo/foo.proto libprotobuf FATAL google/protobuf/descriptor.cc:862] CHECK failed: generated_database_->Add(encoded_file_descriptor, size): terminate called after throwing an instance of 'google::protobuf::FatalException' what(): CHECK failed: generated_database_->Add(encoded_file_descriptor, size):
这是大多数linux 编译caffe版本faster-rcnn 会遇到的情况,我搜集了很多资料,尝试了很多方法,记录下来一个可行的。
首先,出现问题的原因;
在Linux上编译google protobuff时,configure 默认选项是生成动态库,即libprotobuf.so文件。如果同时在多个动态库(动态库以dlopen方式动态加载)中使用同一buff结构.
解决办法,
第一, caffe 的makefile需要修改,找到如下这句:
LIBRARIES += glog gflags boost_system boost_filesystem m hdf5_hl hdf5
删掉protobuf
2,找到下面这句话,
LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) $(PKG_CONFIG) \$(foreach library,$(LIBRARIES),-l$(library))
在后面添加如下语句:
LDFLAGS += -Wl,-Bstatic -lprotobuf -Wl,-Bdynamic
第二,重新编译protobuf
首先卸载以前旧版本protobuf
sudo apt-get remove libprotobuf-dev protobuf-compiler
sudo apt-get remove libprotobuf-lite8 libprotoc8
sudo apt-get remove python-protobuf
sudo pip uninstall protobuf
下载新版本protobuf:下载网址:https://developers.google.com/protocol-buffers/docs/downloads。
以文本形式打开google buff代码目录下的configure文件,在把第2575至2578行修改为如下:
if test "x${ac_cv_env_CFLAGS_set}" = "x"; then : CFLAGS="-fPIC" fi if test "x${ac_cv_env_CXXFLAGS_set}" = "x"; then : CXXFLAGS="-fPIC"
从/src/makefile 中找到
CXXFLAGS = -g -DNDEBUG
修改为如下:
CXXFLAGS = -g -DNDEBUG -fPIC
然后编译protobuf:
configrue --disable-shared
make
make check
sudo make install
sudo ldconfig
注意:在修改文件后编译要重新编译,首先进行make clean ,否则不会重新执行
贴上对我有帮助的参考链接:
https://xiaobai1217.github.io/2017/08/07/fast_rcnn/#more
http://blog.csdn.net/linyushan11/article/details/10378419(我是先按照这个方法做的,但是没有效果,然后结合第一个链接,修改caffe 的makefile,最终解决了问题)