背景
参考https://www.cnblogs.com/tengzijian/p/16793218.html
-
先编译host上的grpc
-
编译arm上的grpc
首先下载arm交叉编译器,注意交叉编译器有多个版本,选择符合架构的编译器
编译器:
gcc
依赖库:
sysroot-glibc 和 runtime-gcc 是 GCC 交叉编译工具链中的两个重要组件,它们的作用如下:
sysroot-glibc:
sysroot 是交叉编译工具链中用于指定目标系统根文件系统的位置。
sysroot-glibc 包含了目标系统所需的 GNU C 库 (glibc) 文件,包括头文件和库文件。
在交叉编译过程中,sysroot-glibc 确保编译器能够找到正确的 glibc 文件,从而生成可在目标系统上运行的可执行文件。
如果目标系统使用其他 C 库,如 musl libc,则需要相应的 sysroot-libc 包。
runtime-gcc:
runtime-gcc 包含了目标系统所需的 GCC 运行时库文件。
这些库文件包括 libgcc、libstdc++ 等,是 GCC 编译器生成的代码所依赖的运行时库。
在交叉编译过程中,runtime-gcc 确保编译器生成的可执行文件能够在目标系统上正确地链接和运行这些 GCC 运行时库。
如果目标系统使用其他编译器,如 Clang,则需要相应的 runtime-compiler 包。
这些库最终可能要移植到板子上
runtime-gcc
sysroot-glibc
遇到的问题
- grpc 交叉编译、hello world 交叉编译
- 编译环境是否需要再docker中进行?会不会某些库要装到系统中而出问题
我们的编译器 gcc6.5 不能编译最新的grpc,需回退版本到1.49
git clone -b v1.49.0 https://github.com/grpc/grpc.git
准备好编译命令:
# build_host
#!/bin/bash
mkdir -p build_host && cd build_host
cmake -DCMAKE_INSTALL_PREFIX=../../output -DCMAKE_STAGING_PREFIX=../../output -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON ../../
make -j32
make install
这里路径根据需要填写,然后bashrc中需要设置一下:
PATH=$PATH:/home/ffy/libgrpc/bin/
export PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ffy/libgrpc/lib
export LD_LIBRARY_PATH
使得工具能被正确的找到以及能正确连接库
编译arm
#!/bin/bash
mkdir -p build_arm && cd build_arm
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake -DCMAKE_INSTALL_PREFIX=/home/ffy/grpc_arm -DCMAKE_STAGING_PREFIX=/home/ffy/grpc_arm -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON ../../
make -j32
make install
安装路径根据需要填写,
Q: 如何检查编译输出的架构:
使用 readelf 命令:
readelf 命令可以更详细地查看 ELF 文件的信息,包括架构类型。执行 readelf -h your_library.so 命令,查看 "Machine" 字段:
ffy@asdfg-2288H-V5:~/grpc_arm/lib$ readelf -h libabsl_hash.so.2206.0.0
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: ARM 注意这个地方的架构
Version: 0x1
Entry point address: 0xaa0
Start of program headers: 52 (bytes into file)
Start of section headers: 12148 (bytes into file)
Flags: 0x5000400, Version5 EABI, hard-float ABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 6
Size of section headers: 40 (bytes)
Number of section headers: 34
Section header string table index: 33
编译出的体积:
du -sh
27M
这个体积比较合适
交叉编译demo:
cmake -DCMAKE_TOOLCHAIN_FILE=/home/ffy/work/grpc/cmake/toolchain.cmake -DCMAKE_BUILD_TYPE=Release -Dabsl_DIR=~/grpc_arm/lib/cmake/absl -DProtobuf_DIR=~/grpc_arm/lib/cmake/protobuf -DgRPC_DIR=~/grpc_arm/lib/cmake/grpc ..
下面的步骤就是准备编写demo,以及在虚拟机上验证了。
arm-docker 镜像
曲线救国之docker 镜像安装
因为一些原因,现在国内的docker 镜像仓库都G了,我自己试了一些代理配置的方法从官方仓库拉总是不成功,这里给出一个曲线救国的方法:
-
目前腾讯云、阿里云的云服务器在其内网仍然有镜像服务器。我们可以用他们的服务器来拉取特定的镜像
- 其镜像源可能不是最新的,如果需要一些最新的镜像,建议还是想其他办法
-
将拉取的镜像导出
-
在本地导入2.中导出的镜像
-
准备一个运行测试环境,整理部署相关依赖
- 使用实体板子
- 使用qemu+docker模拟
- docker 现在镜像仓库存在问题,能否离线拉取?
sudo docker run -it --shm-size=8g --ulimit memlock=-1 --cpus=2 --platform linux/arm/v7 -v /home/kkk/data:/data arm32v7/ubuntu:20.04
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/grpc_arm/lib/
error while loading shared libraries: libhw_grpc_proto.so: cannot open shared object file: No such file or directory
拷贝这个库,然后放上去,就可以直接运行了。
arm 容器内跑server和 client 通信正常
cmake 编写
protoc --grpc_out /home/ffy/work/grpc_helloworld/idl/tmp --cpp_out /home/ffy/work/grpc_helloworld/idl/tmp/ -I /home/ffy/work/grpc_helloworld/idl --plugin=protoc-gen-grpc=/home/ffy/libgrpc/bin/grpc_cpp_plugin helloworld.proto
add_custom_command(
OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" "${hw_grpc_hdrs}"
COMMAND ${_PROTOBUF_PROTOC}
ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"
--cpp_out "${CMAKE_CURRENT_BINARY_DIR}"
-I "${hw_proto_path}"
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
"${hw_proto}"
DEPENDS "${hw_proto}")
注意,工具链配置要放到project 之前,否则查找库会有问题:
cmake_minimum_required(VERSION 3.8)
# configure cross compile.
set(TOOLCHAIN_DIR /opt/asdfg/arm-asdfg-linux-gnueabihf/)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/arm-asdfg-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/arm-asdfg-linux-gnueabihf-g++)
#fuck.
project(kkkHello C CXX)
浙公网安备 33010602011771号