问题

在一个c++项目里用到了protobuf3.6.1,运用网上的安装方法后编译出现了这样的问题。

原因总结

  1. 所用的protobuf是旧版本的GCC(5之前的版本)所编译的,所以需要卸载后重新用新版本的编译一遍,如果有其他项目引用了旧版本的protobuf,就也不能用了。
  2. 明明是新下载安装的protobuf,用的也是新的gcc,仍然有这样的问题。是因为在安装protobuf之前,其实系统里还有一个protobuf,所以用的时候发生了冲突,项目实际上用的是这个旧的。我因为之前安装过ros,里面自带了一个3.0.0版本的,是用老gcc编译的。所以卸载的时候需要把旧的一起卸载了。直到运行protoc --version后提示找不到文件为止。
  3. 在编译的时候有一个细节也会导致这样类似的undefined reference问题。命令实际上用的是~键的那个 `,不是普通的 '。
例如:
序列化:g++ add_person.cc addressbook.pb.cc `pkg-config --cflags --libs protobuf`
反序列化:g++ list_people.cc addressbook.pb.cc `pkg-config --cflags --libs protobuf`

解决

  1. 如果因为反复./configure xx然后make会导致安装路径混乱,sudo make install失败。所以如果路径设错了又已经make完,需要make clean来清除一下。
  2. 如果想把自己刚刚make install安装的protobuf卸载,可以在那个目录里直接用sudo make uninstall
  3. 如果系统里有一个莫名出现的旧版本protobuf,运用这里的方法卸载重安:卸载系统里自带的旧版本重新安装
  4. 不同版本的protobuf可以共存,网上有解决冲突的办法,只不过我没有尝试。
  5. 也可以强制自己的项目用旧版本编译。只不过新特性的东西全不能用了。在main.cpp的最顶上写-D_GLIBCXX_USE_CXX11_ABI=0即可。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐