解决protobuf: undefined reference to `google::protobuf::internal::fixed_address_empty_string[abi:cxx11
问题在一个c++项目里用到了protobuf3.6.1,运用网上的安装方法后编译出现了这样的问题。原因总结所用的protobuf是旧版本的GCC(5之前的版本)所编译的,所以需要卸载后重新用新版本的编译一遍,如果有其他项目引用了旧版本的protobuf,就也不能用了。明明是新下载安装的protobuf,用的也是新的gcc,仍然有这样的问题。是因为在安装protobuf之前,其实系统里还有一个pro
·
问题
在一个c++项目里用到了protobuf3.6.1,运用网上的安装方法后编译出现了这样的问题。
原因总结
- 所用的protobuf是旧版本的GCC(5之前的版本)所编译的,所以需要卸载后重新用新版本的编译一遍,如果有其他项目引用了旧版本的protobuf,就也不能用了。
- 明明是新下载安装的protobuf,用的也是新的gcc,仍然有这样的问题。是因为在安装protobuf之前,其实系统里还有一个protobuf,所以用的时候发生了冲突,项目实际上用的是这个旧的。我因为之前安装过ros,里面自带了一个3.0.0版本的,是用老gcc编译的。所以卸载的时候需要把旧的一起卸载了。直到运行
protoc --version
后提示找不到文件为止。 - 在编译的时候有一个细节也会导致这样类似的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`
解决
- 如果因为反复
./configure xx
然后make
会导致安装路径混乱,sudo make install
失败。所以如果路径设错了又已经make
完,需要make clean
来清除一下。 - 如果想把自己刚刚
make install
安装的protobuf卸载,可以在那个目录里直接用sudo make uninstall
- 如果系统里有一个莫名出现的旧版本protobuf,运用这里的方法卸载重安:卸载系统里自带的旧版本重新安装
- 不同版本的protobuf可以共存,网上有解决冲突的办法,只不过我没有尝试。
- 也可以强制自己的项目用旧版本编译。只不过新特性的东西全不能用了。在main.cpp的最顶上写
-D_GLIBCXX_USE_CXX11_ABI=0
即可。
更多推荐
已为社区贡献1条内容
所有评论(0)