linux x86_64 下编译grpc总结

grpc库的编译需要依赖多个三方库,官方建议通过./.gitmodules去获取依赖库,但我的linux环境是不能联网的,必须离线安装。

查看./.gitmodules文件,其实是去github把代码拉取到gprc的thirdparty/对应的目录下,具体如下

将编译过程中缺少的三方库在windows下载好,拷贝至对应的目录即可

编译过程中会报错unrecognized command line option ‘-mfloat-abi=hard’,上网上搜索原因为GCC版本高于4.8,而这行命令在新的GCC中已去掉了,我的当前版本为4.8.5,然而我还是升级到了9.3.0,最后编译成功;

另外我们公司使用的grpc版本为1.22.1

我的服务端启动后卡死,pstack查看具体原因,原来卡死在grpc_tracer_init()函数内,cpu占用100%,查看grpc的issue发现这是一个已解决bug(当前最新为1.27.0版本)但我们的gcc不支持编译(当前grpc要求gcc版本最低为4.8.9),因此只能按照此issue的方式修改grpc源码,重新编译,具体方式如下:

https://github.com/joda01/grpc/commit/3a54951b546424a930dafc50069297a47240f5f7

issue地址如下:

https://github.com/grpc/grpc/issues/21609

----------------------------------------------------------------------------------

以下内容引自https://www.jianshu.com/p/efc9167e7044

执行 make install 就会自动安装上述编译所生成的库及二进制程序。这一步非常简单,其实质只是把相应的文件拷贝的系统目录而已。
想要知道具体会安装哪些文件,查看 Makefile 即可。
安装内容相当的复杂,实际上,我们没有必要去了解每个细节,只要知道哪些主要文件会被安装,以及他们会被安装在哪个目录就可以了。

我在这里对整个安装过程做了一个总结,如下:

(1)要安装的文件
按照文件类型,我把要安装或者说拷贝到系统目录的文件主要有以下几个部分:

    1. grcp 的相关头文件
    1. 静态库,动态库
    1. 可执行文件 (也即以 _plugin 结尾的各语言的 grpc 插件)

(2) 安装至的目录 (默认 /usr/local

如果没有指定安装目录的 prefix,那么默认的 prefix 是 /usr/local。如果想使用其他 prefix 比如 /usr,那么可以编辑 Makefile 文件修改 prefix 变量。
或者 make install DISTDIR=/usr/local 。

It depends on the package. If the Makefile is generated by GNU autotools (./configure) you can usually set the target location like so:
./configure --prefix=/usr/local
If the Makefile is not generated by autotools, but distributed along with the software, simply open it up in an editor and change it. The install target directory is probably defined in a variable somewhere.

从上文可知,如果源码包没有提供 configure 配文件,最可靠的办法就是编辑 Makefile 文件来指定 prefix。

按照不同的类型区别,它们分别将安装在如下目录

(1)头文件
$prefix/include
注:源码文件通常会在 $prefix/src 中,但通常没有必要安装源码。

(2)静态库及动态库 (.a 文件,.so,.so.x.x 文件)
对不同语言的支持,会有不同的静态库及动态库文件。
$prefix/lib

(3) plugins,也就是二进制文件
$prefix/bin

(4) pkg-config 文件
$prefix/lib/pkg-config

(5)证书文件 certs
$prefix/share/grpc

比如,根证书文件为:
$prefix/share/grpc/roots.pem

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章