由于本组业务需要,新架构需要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