实战搞定gRPC之移植篇

2023-11-09

一、交叉编译protobuf

1.配置交叉编译器
export PATH=$PATH:/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/bin:/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/lib

source /opt/EC20_crosstool/ql-ol-crosstool/ql-ol-crosstool-env-init
2.编译
1.cd /home/workspace/project/arm_grpc/third_party/protobuf/cmake
2.mkdir arm_build
3.cd arm_build
4.cmake .. -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_CXX_COMPILER:FILEPATH=/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/bin/arm-oe-linux-gnueabi/arm-oe-linux-gnueabi-g++ -DCMAKE_C_COMPILER:FILEPATH=/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/bin/arm-oe-linux-gnueabi/arm-oe-linux-gnueabi-gcc -DCMAKE_BUILD_TYPE:STRING=RELEASE -DCMAKE_INSTALL_PREFIX=/home/workspace/test/arm_install -DBUILD_SHARED_LIBS=ON
5.make -j8
6.make install -j8


编译的时候报错

原因是/usr/local/lib/libz.so是Ubuntu下编译的,因此需要交叉编译libz.so,在EC20编译器中搜索到有这个库。为了图省事,直接将EC20中的libz.so拷贝替换/usr/local/lib/中的libz.so。

编译成功

二、交叉编译grpc

1.mkdir -p cmake/arm_build
2.cd cmake/arm_build
3.cmake ../.. -DCMAKE_CXX_COMPILER:FILEPATH=/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/bin/arm-oe-linux-gnueabi/arm-oe-linux-gnueabi-g++ -DCMAKE_C_COMPILER:FILEPATH=/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/bin/arm-oe-linux-gnueabi/arm-oe-linux-gnueabi-gcc -DCMAKE_BUILD_TYPE:STRING=RELEASE -DCMAKE_INSTALL_PREFIX=/home/workspace/test/arm_install -DBUILD_SHARED_LIBS=ON


执行make报错

/home/workspace/test/grpc/third_party/boringssl-with-bazel/linux-x86_64/crypto/chacha/chacha-x86_64.S: Assembler messages:
/home/workspace/test/grpc/third_party/boringssl-with-bazel/linux-x86_64/crypto/chacha/chacha-x86_64.S:1633: Error: junk at end of line, first unrecognized character is `,'
make[2]: *** [third_party/boringssl-with-bazel/CMakeFiles/crypto.dir/linux-x86_64/crypto/chacha/chacha-x86_64.S.o] Error 1
make[1]: *** [third_party/boringssl-with-bazel/CMakeFiles/crypto.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....


使用make -j8 HAS_PKG_CONFIG=false PROTOBUF_CONFIG_OPTS="–host=arm-oe-linux-gnueabi --with-protoc=/usr/local/bin/protoc" 错误还是一样。
具体原因还是没找到。放弃cmake的方式进行编译。直接在grpc目录下使用make的方式编译,不通过cmake重新构造Makefile。

export GRPC_CROSS_COMPILE=true
export GRPC_CROSS_AROPTS=“cr --target=elf32-little”

make clean  注意一定要先清除,不然会编译出错。
make -j8 HAS_PKG_CONFIG=false CC=arm-oe-linux-gnueabi-gcc CXX=arm-oe-linux-gnueabi-g++ RANLIB=arm-oe-linux-gnueabi-ranlib LD=arm-oe-linux-gnueabi-ld LDXX=arm-oe-linux-gnueabi-g++ AR=arm-oe-linux-gnueabi-ar PREFIX=/home/workspace/test/arm_install PROTOBUF_CONFIG_OPTS="--host=arm-oe-linux-gnueabi --with-protoc=/usr/local/bin/protoc"


没办法make install,因为是交叉编译,只需将libs/opt中的库文件拷贝到设备中即可。
之前因为没有添加export GRPC_CROSS_COMPILE=true
export GRPC_CROSS_AROPTS=“cr --target=elf32-little”。
导致libs/opt并没有看到交叉编译过的grpc库。


添加之后重新编译,编译成功。


说明arm版本已经编译ok了。

还有一种比较简单的方式判断当前库是交叉编译还是gcc版本。因为我电脑是64位,开发板是32位,所以直接使用objdump来进行判断。例如:
objdump -a libgrpc.a

三、交叉编译demo与设备实测

交叉编译helloworld demo

使用make方式进行编译。只需要交叉编译greeter_server和greeter_client测试基本功能就好了,顺便看看哪些库可以不用拷贝到设备中。

cd /home/workspace/test/grpc/examples/cpp/helloworld

make greeter_server HAS_PKG_CONFIG=false CC=arm-oe-linux-gnueabi-gcc CXX=arm-oe-linux-gnueabi-g++ RANLIB=arm-oe-linux-gnueabi-ranlib LD=arm-oe-linux-gnueabi-ld LDXX=arm-oe-linux-gnueabi-g++ AR=arm-oe-linux-gnueabi-ar PREFIX=/home/workspace/project/grpc/arm_build PROTOBUF_CONFIG_OPTS="–host=arm-oe-linux-gnueabi --with-protoc=/usr/local/bin/protoc"

如果忘记将libs/opt中的库拷贝到交叉编译protobuf 安装的目录/home/workspace/test/arm_install中的话就会报错。

发现只要链接这三个库就可以。于是我只拷贝这几个库(因为编译出来得库都挺大的)。而且还要修改下helloworld目录下的makefile
修改前

修改后

交叉编译成功


将这些库拷贝到设备中

设置好设备的环境变量。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usrdata/grpc/lib

运行时发现,占用空间都一致应该是同一个动态库,因此为了节省空间创建软连接。


最终在EC20设备上成功运行。

但存在个问题,库太占用空间了。后面得想办法裁剪一下。

过程中遇到的一些坑爹的问题,后面重头操作几次后,总算解决了。顺便记录下自己过程中遇到的奇奇怪怪的问题。

错误:

[HOSTCXX] Compiling src/compiler/cpp_generator.cc
In file included from ./src/compiler/config_protobuf.h:22:0,
                 from ./src/compiler/config.h:22,
                 from ./src/compiler/cpp_generator.h:29,
                 from src/compiler/cpp_generator.cc:21:
include/grpcpp/impl/codegen/config_protobuf.h:30:37: fatal error: google/protobuf/message.h: No such file or directory
 #include <google/protobuf/message.h>
                                     ^
compilation terminated.
make: *** [/home/workspace/project/grpc/objs/opt/src/compiler/cpp_generator.o] Error 1
make: *** Waiting for unfinished jobs....
CXX      google/protobuf/compiler/main.o
  CXXLD    libprotobuf-lite.la
libtool: link: warning: library `/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/bin/arm-oe-linux-gnueabi/../../armv7a-vfp-neon-oe-linux-gnueabi/usr/lib/libstdc++.la' was moved.
  CXXLD    libprotobuf.la
libtool: link: warning: library `/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/bin/arm-oe-linux-gnueabi/../../armv7a-vfp-neon-oe-linux-gnueabi/usr/lib/libstdc++.la' was moved.
  CXXLD    libprotoc.la
libtool: link: warning: `/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/bin/arm-oe-linux-gnueabi/../../armv7a-vfp-neon-oe-linux-gnueabi/usr/lib/libstdc++.la' seems to be moved
libtool: link: warning: library `/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/bin/arm-oe-linux-gnueabi/../../armv7a-vfp-neon-oe-linux-gnueabi/usr/lib/libstdc++.la' was moved.
  CXXLD    protoc
libtool: link: warning: library `/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/bin/arm-oe-linux-gnueabi/../../armv7a-vfp-neon-oe-linux-gnueabi/usr/lib/libstdc++.la' was moved.
libtool: link: warning: library `/opt/EC20_crosstool/ql-ol-crosstool/sysroots/x86_64-oesdk-linux/usr/bin/arm-oe-linux-gnueabi/../../armv7a-vfp-neon-oe-linux-gnueabi/usr/lib/libstdc++.la' was moved.
./.libs/libprotoc.so: error: undefined reference to 'descriptor_table_google_2fprotobuf_2fdescriptor_2eproto'
./.libs/libprotoc.so: error: undefined reference to 'scc_info_FileDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto'
collect2: error: ld returned 1 exit status
make[2]: *** [protoc] Error 1
make[2]: Leaving directory `/home/workspace/project/grpc/third_party/protobuf/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/workspace/project/grpc/third_party/protobuf'
make: *** [all] Error 2
grpc_transport* grpc_create_cronet_transport(void* engine, const char* target,
                 ^
[AR]      Creating /home/workspace/project/grpc/libs/opt/libgrpc_cronet.a
[STRIP]   Stripping libaddress_sorting.a
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libaddress_sorting.a(address_sorting_posix.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libaddress_sorting.a(address_sorting_windows.o)'
[STRIP]   Stripping libgpr.a
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libgpr.a(atm.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libgpr.a(cpu_iphone.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libgpr.a(cpu_linux.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libgpr.a(cpu_posix.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libgpr.a(cpu_windows.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libgpr.a(env_linux.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libgpr.a(env_posix.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libgpr.a(env_windows.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libgpr.a(log.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libgpr.a(log_android.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libgpr.a(log_linux.o)'
strip: Unable to recognise the format of the input file `/home/workspace/project/grpc/libs/opt/libupb.a(upb.o)'
[INSTALL] Installing C pkg-config files
[INSTALL] Installing libaddress_sorting.a
[INSTALL] Installing libgpr.a
[INSTALL] Installing libgrpc.a
[INSTALL] Installing libgrpc_cronet.a
[INSTALL] Installing libgrpc_unsecure.a
[INSTALL] Installing libupb.a
[LD]      Linking /home/workspace/project/grpc/libs/opt/libaddress_sorting.so.9.0.0
/usr/bin/ld: /home/workspace/project/grpc/objs/opt/third_party/address_sorting/address_sorting.o: Relocations in generic ELF (EM: 40)
/usr/bin/ld: /home/workspace/project/grpc/objs/opt/third_party/address_sorting/address_sorting.o: Relocations in generic ELF (EM: 40)
/usr/bin/ld: /home/workspace/project/grpc/objs/opt/third_party/address_sorting/address_sorting.o: Relocations in generic ELF (EM: 40)
/usr/bin/ld: /home/workspace/project/grpc/objs/opt/third_party/address_sorting/address_sorting.o: Relocations in generic ELF (EM: 40)
/usr/bin/ld: /home/workspace/project/grpc/objs/opt/third_party/address_sorting/address_sorting.o: Relocations in generic ELF (EM: 40)
/home/workspace/project/grpc/objs/opt/third_party/address_sorting/address_sorting.o: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
make: *** [/home/workspace/project/grpc/libs/opt/libaddress_sorting.so.9.0.0] Error 1
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Found ZLIB: /usr/local/lib/libz.so (found version "1.2.11")
-- Using protobuf
CMake Error at CMakeLists.txt:113 (find_package):
  Could not find a configuration file for package "gRPC" that is compatible
  with requested version "".

  The following configuration files were considered but not accepted:

    /usr/local/lib/cmake/grpc/gRPCConfig.cmake, version: 1.28.0-pre3 (64bit)
[CXX]     Compiling src/core/tsi/ssl_transport_security.cc
gnu-configize: 'configure.ac' or 'configure.in' is required
autoreconf: gnu-configize failed with exit status: 1
make: *** [third_party/protobuf/configure] Error 1
make: *** Waiting for unfinished jobs....
src/core/tsi/fake_transport_security.cc:498:34: warning: unused parameter 'self' [-Wunused-parameter]
     const tsi_handshaker_result* self, tsi_peer* peer) {
make  all-recursive
make[1]: Entering directory `/home/workspace/project/grpc/third_party/protobuf'
Making all in .
make[2]: Entering directory `/home/workspace/project/grpc/third_party/protobuf'
make[2]: Leaving directory `/home/workspace/project/grpc/third_party/protobuf'
Making all in src
make[2]: Entering directory `/home/workspace/project/grpc/third_party/protobuf/src'
  CXXLD    protoc
./.libs/libprotoc.so: error: undefined reference to 'descriptor_table_google_2fprotobuf_2fdescriptor_2eproto'
./.libs/libprotoc.so: error: undefined reference to 'scc_info_FileDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto'
collect2: error: ld returned 1 exit status
make[2]: *** [protoc] Error 1
make[2]: Leaving directory `/home/workspace/project/grpc/third_party/protobuf/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/workspace/project/grpc/third_party/protobuf'
make: *** [all] Error 2

-- Found Protobuf: /usr/local/bin/protoc-3.11.2.0 (found version "3.11.2.0")
-- Using protobuf
CMake Error at CMakeLists.txt:113 (find_package):
  Could not find a configuration file for package "gRPC" that is compatible
  with requested version "".

  The following configuration files were considered but not accepted:

    /usr/local/lib/cmake/grpc/gRPCConfig.cmake, version: 1.28.0-pre3 (64bit)



-- Configuring incomplete, errors occurred!

差点整崩溃,后面几次重新解压源码重新流程操作几次与参考网上博客,总算问题解决了。

四、参考资料

交叉编译gRPC_嵌入式_maimang1001的专栏-CSDN博客 https://blog.csdn.net/maimang1001/article/details/100561970

移植protobuf遇到的一点小问题_Johnny_nass_hu的专栏-CSDN博客 https://blog.csdn.net/Johnny_nass_hu/article/details/84138749

grpc arm 交叉编译(ubuntu 16.04)_嵌入式_学习————-CSDN博客 https://blog.csdn.net/qq_35487883/article/details/94398728

记一次grpc arm-hisiv400-linux交叉编译_嵌入式_vc66vcc的博客-CSDN博客 https://blog.csdn.net/vc66vcc/article/details/83614906

Arm下Grpc交叉编译过程记录_嵌入式_深圳趣奇多科技-CSDN博客 https://blog.csdn.net/poolooloo/article/details/97890673

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实战搞定gRPC之移植篇 的相关文章

随机推荐

  • 解决数据库死锁现象

    解决数据库死锁现象 一 日志情况 日志情况如下 信息 At least one JAR was scanned for TLDs yet contained no TLDs Enable debug logging for this log
  • JS函数 ,变量

    6函数 6 1函数的概念 大事化小 将复杂的问题简单化 如何大事化小呢 通过函数 为什么需要有函数 首先看一下输出100以内所有素数的解决方案 方案一 循环嵌套 var n Number prompt 请输入一个自然数 var m Math
  • Microsoft Office 2016(ProPlus/Visio/Project) VOL 简体中文版

    Office 2016 专业增强版32 位 文件名 SW DVD5 Office Professional Plus 2016 W32 ChnSimp MLF X20 41351 ISO SHA1 0218F50774AAB63AF7755
  • node中Express的use深入理解

    Express的API 现在学node 不来点Express 都不好意思给人打招呼 但是 我刚接触的时候 觉得好多API 感觉乱糟糟的 没办法 大脑容量不够 不过有一样东西叫地铁 在上面可以让人想清楚很多事情 先来一段最简单的node版he
  • 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)

    原文见 Understanding TCP Sequence and Acknowledgment Numbers PacketLife net 如果你正在读这篇文章 很可能你对TCP 非著名 的 三次握手 或者说 SYN SYN ACK
  • 系列:4.4、Kubernetes 存储

    Kubernetes 存储 Kubernetes storage存储的相关选项 1 Kubernetes Volumes 由于 Pod 是短暂的 我们有时要求 Pod 上的数据可用于下一个计划的 Pod 或者 有时容器应该在 Pod 中共享
  • 为什么c++输出char类型变量的地址出现的是乱码?

    char a h cout lt lt a 就会出现乱码 h烫烫烫烫篾 看了这个贴 https bbs csdn net topics 310062432 改成printf p a 或者std cout lt lt void a 就可以输出
  • Frida—HOOK 学习笔记2

    Android部分 基础知识 1 安卓分层 简单提一下安卓分层 这个点知道了更好 不知道也无所谓 毕竟我们不是开发 只是为了避免下述情况 我要学习so文件HOOK 一波百度 HOOK so层 之后 出现了一个 native 点进去一看 其内
  • Redis学习笔记(七):底层数据结构和对象

    第一章 数据结构与对象 一 简单动态字符串 SDS 在Redis中默认字符串的表示使用了简单动态字符串 Simple Dynamic String 而没有使用C语言中的传统字符串 字面量 string literal 字面量只用来表示一些无
  • 【RabbitMQ教程】- 实现延时队列

    目录 RabbitMQ实现延时队列 Maven依赖 代码实现 1 插件方式 RabbitMQ实现延时队列 RabbitMQ实现延时队列有两种方式 1 死信队列 2 下载插件 Maven依赖 Maven依赖
  • 力扣(LeetCode)每日一题 1921. 消灭怪物的最大数量

    只需要三个步骤 1 初始化 2 排序 3 遍历 class Solution public int eliminateMaximum int dist int speed 初始化 每个怪物到达城市所需要的回合数目 int times new
  • QEMU-运行一个字符驱动(3)

    上面是我的微信和QQ群 欢迎新朋友的加入 上代码 chardriver c include
  • Web 组件代码示例

    在本文中 我提供了对 Web 组件是什么以及如何使用它们的基本理解 使用现实生活中的示例 我将展示 Web 组件如何帮助使应用程序更可预测和更易于维护 此外 我分享了有关如何通过将 HTML CSS JS 代码隔离为 等待它 隔离的组件以供
  • 二叉查找树 数组实现 ArrayBinarySearchTree

    数组实现的二叉查找树 适用查找操作频繁 插入 删除操作较少的情况 代码 using System namespace DataStructure 数组实现的二叉查找树 输入一个数组 获得一颗二叉查找树 找parent 和 child ind
  • 华为OD机试 - 文件目录大小(Java & JS & Python)

    题目描述 一个文件目录的数据格式为 目录id 本目录中文件大小 子目录id列表 其中目录id全局唯一 取值范围 1 200 本目录中文件大小范围 1 1000 子目录id列表个数 0 10 例如 1 20 2 3 表示目录1中文件总大小是2
  • c++ 实现信号和槽机制

    主要通过 c 实现类型QT 信号和槽的问题 设计思路 1 利于模板函数和模板类的 通用性 2 BInd的时候 讲槽函数指针保存 触发时调用 代码如下 include
  • 用python函数写斐波那契数列的函数_python—函数进阶-斐波那契数列

    上次说到生成器的调用next 这样很不方便 需要手动调 我们一般是循环着调 while for都可以 a i for i in range 5 for i in a print i 0 1 2 3 4 执行结果 和手动调的区别是没了的话就会
  • [高级数据结构C++] 线段树(区间和的查询与修改)

    算法竞赛 file author jUicE g2R qq 3406291309 彬 bin 必应 一个某双流一大学通信与信息专业大二在读 brief 一直在算法竞赛学习的路上 copyright 2023 9 COPYRIGHT 原创技术
  • vue-quill-editor 富文本编辑器上传图片自base64改为上传到服务器

    就是要一个富文本编辑器 然后有图片上传功能 因为vue quill editor是将图片转为base64编码 所以当图片比较大时 提交后台时参数过长 导致提交失败 vue quill editor引入过程略 我其它文章里面有 废话不多说 上
  • 实战搞定gRPC之移植篇

    一 交叉编译protobuf 1 配置交叉编译器 export PATH PATH opt EC20 crosstool ql ol crosstool sysroots x86 64 oesdk linux usr bin opt EC2