• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
fyyy94
博客园    首页    新随笔    联系   管理    订阅  订阅
grpc 交叉编译

背景

参考https://www.cnblogs.com/tengzijian/p/16793218.html

  1. 先编译host上的grpc

  2. 编译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

遇到的问题

  1. 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了,我自己试了一些代理配置的方法从官方仓库拉总是不成功,这里给出一个曲线救国的方法:

  1. 目前腾讯云、阿里云的云服务器在其内网仍然有镜像服务器。我们可以用他们的服务器来拉取特定的镜像

    • 其镜像源可能不是最新的,如果需要一些最新的镜像,建议还是想其他办法
  2. 将拉取的镜像导出

  3. 在本地导入2.中导出的镜像

  4. 准备一个运行测试环境,整理部署相关依赖

    • 使用实体板子
    • 使用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)
posted on 2025-09-01 18:25  feiyangyy94  阅读(31)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3