下载Protobuf源码(c++)
获取源码:protobuf-cpp-3.11.4.tar.gz
如果需要其他语言的源码,请下载
protobuf-all-[VERSION].tar.gz
,其中的all
也可替换为其他单独的一种语言,如protobuf-java-[VERSION].tar.gz
如果想要用git clone
获取源码,还需要多一步获取子模块,请参考官方使用文档 README.md
编译安装Protobuf源码
接下来,编译并安装Protobuf:
为了有序,我把安装目录设定为/usr/local/protobuf
./configure --prefix=/usr/local/protobuf
make
make check
sudo make install
sudo ldconfig # refresh shared library cache.
这里就安装完成了,然后使用
protoc --version
查询版本号,如果有就说明安装成功。
如果不成功,请配置一下环境变量/etc/profile
,参考jackytse_:linux下安装google protobuf(详细)
下载grpc源码
make
make check
sudo make install
测试grpc
grpc中提供了一些例子供快速上手:
cd ./examples/cpp/helloworld
make
./greeter_server
切换到另一个终端:
./greeter_client
顺利的话会看到Hello World
参考:examples
报错解决
本人使用gcc9和grpc1.22.0,所以出现了一些问题,经过搜索后,发现在上游社区里有些pr更新正好解决了这些问题,记录如下:
- 报错:
implicitly-declared operator= is deprecated
原因:gcc 9导致
解决方案来源:Github/grpc:#19647
解决方案:在include/grpcpp/impl/codegen/call_op_set.h
line 90添加
/// Default assignment operator
WriteOptions& operator=(const WriteOptions& other) = default;
- 报错:
error: ambiguating new declaration of ‘long int gettid()’
原因:gcc 9导致
解决方案来源:Github/grpc:#20043
解决方案:将src/core/lib/gpr/log_linux.cc
、src/core/lib/gpr/log_posix.cc
、src/core/lib/iomgr/ev_epollex_linux.cc
这几个文件中的
gettid()
改为sys_gettid()
- 报错:
no reference on protobuf blablabla
(记不太清了,大概是这样,跟protobuf有关)
原因:protobuf版本太旧
解决方案来源:Github/protobuf项目里有人提了这个问题但没有解决,有人评论是用了最新的protobuf就好了,可能是里面某一个更新解决了这个问题。
解决方案:安装新版本protobuf - 自己造的一个大坑。。在安装完protobuf之后,想当然地以为它安装在了
/usr/local
目录下,实际上看编译配置文件会发现它默认安装在/usr
下,导致我配环境变量的时候PKGCONFIG路径配错了。。。