gRPC/Protobuf ARM Linux交叉编译记录

【背景】

由于本组业务需要,新架构需要RPC框架作为支持。

gRPC以其高效的性能以及方便的接口广为人知,作为技术储备,需要预研gRPC在arm v5te架构和cortex A7架构下的移植可能性。

【准备】

gRPC交叉编译之前,需要先交叉编译好protobuf,并且与交叉编译其他库不同的是,gRPC需要先生成宿主机平台的protobuf和gRPC。原因是在gRPC交叉编译的过程中,需要使用对应的编译平台的bin文件(protoc,grpc_cpp_plugin等等),所以第一步是需要在宿主机平台完成gRPC和protobuf的安装。

宿主机的库编译没什么技巧,传统的三步曲,configure,make,make install。按照自己宿主机的性能可以考虑在make的时候-j4或者-j8。

编译protobuf:

./autogen.sh && ./configure && make -j4
sudo make install -j4
sudo ldconfig

编译gRPC:

make -j4 && sudo make install -j4 && sudo ldconfig

如果害怕污染服务器环境,或者没有编译服务器的管理员权限,其实也没事。在configure的时候,加--prefix=/home/xiaoyanyi/work/(可以替换为任意你有权限的路径),然后输入以下命令,可以在后续编译中找到需要的头文件以及应用文件。

export PKG_CONFIG_PATH=/home/xiaoyanyi/work/bin/lib/pkgconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xiaoyanyi/work/bin/lib/
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/home/xiaoyanyi/work/bin/include/
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/home/xiaoyanyi/work/bin/include/

【交叉编译】

完成上述的准备后,可以开始交叉编译gRPC了,首先依旧是编译嵌入式系统中的protobuf,这里都没什么特别需要说的,和编译普通的嵌入式库样,--host指定编译工具链名称即可

./autogen.sh && ./configure --host=arm-at91-gnueabi && make -j4
sudo make install -j4
sudo ldconfig

也可以手动按照环境变量指定,效果一样。

export CC=arm-at91-linux-gnueabi-gcc
export CXX=arm-at91-linux-gnueabi-g++
export RANLIB=arm-at91-linux-gnueabi-ranlib
export LD=arm-at91-linux-gnueabi-ld
export LDXX=arm-at91-linux-gnueabi-g++
export AR=arm-at91-linux-gnueabi-ar
export STRIP=arm-at91-linux-gnueabi-strip

交叉编译gRPC

export GRPC_CROSS_COMPILE=true
export GRPC_CROSS_AROPTS="cr --target=elf32-little"
export HAS_PKG_CONFIG=false

export CC=arm-at91-linux-gnueabi-gcc
export CXX=arm-at91-linux-gnueabi-g++
export RANLIB=arm-at91-linux-gnueabi-ranlib
export LD=arm-at91-linux-gnueabi-ld
export LDXX=arm-at91-linux-gnueabi-g++
export AR=arm-at91-linux-gnueabi-ar
export STRIP=arm-at91-linux-gnueabi-strip
export prefix=/home/xiaoyanyi/work/grpcat91_new

PROTOBUF_CONFIG_OPTS="--host=arm-at91-linux-gnueabi --with-protoc=/home/xiaoyanyi/work/bin/bin/protoc"

make -j32

这里稍微有些不同,可以看到需要指定protoc这个程序的路径,这个程序就是我们上面在宿主机安装gRPC的时候,生成的bin文件,把这个路径指定对就行。

 

安装的过程中,还会遇到很多依赖库没有,这个时候,下载好对应的库,然后解压到gRPC源码目录下面的/grpc-1.29.1/third_party中对应文件夹里即可,这里一般会遇到abseil-cpp,cares,protobuf,zlib等,需要的做法都是一致的,下载好源码包,然后解压完之后cp到对应目录即可。文章末尾有各源码包的下载路径。

 

在最后快交叉编译结束的时候,会提示找不到grpc_cpp_plugin等类似语言的报错,其实是交叉编译版本的grpc_cpp_plugin在宿主机中无法运行的问题,替换/grpc-1.29.1/bins/opt中对应的文件,用之前步骤中安装的宿主机版本的grpc_cpp_plugin等文件即可通过编译。

 

【后记】

https://blog.csdn.net/poolooloo/article/details/97890673

此文章说识别不到Wl等参数,只能静态编译是不对的,其实加入STRIP的编译参数,然后即可编译动态库。不过也有可能是这位兄台的编译工具链有问题。

对于编译工具链的制作方式,可以参考我之前的另一篇博客。

https://blog.csdn.net/aiyanzielf/article/details/106205314

 

各个源码包下载路径:

grpc-1.29.1.tar.gz

https://download.csdn.net/download/aiyanzielf/12610000

protobuf-cpp-3.12.3.tar.gz

https://download.csdn.net/download/aiyanzielf/12610007

gperftools-gperftools-2.7.90.zip

https://download.csdn.net/download/aiyanzielf/12507068

abseil-cpp

https://download.csdn.net/download/aiyanzielf/12507059

c-ares-1.16.1.tar.gz

https://download.csdn.net/download/aiyanzielf/12507065

 

你可能感兴趣的:(嵌入式,grpc,arm,arm-linux-gcc)