docker ubuntu:20.04构建c++ grpc环境

由c++ grpc必须源码编译,ubuntu版本不同可能出现的问题也不同,这里分享下我的构建过程。
我是vscode结合docker去安装c++虚拟环境,我不想污染本机环境。
vscode的插件Dev Containers
Dockerfile如下(如果单纯是ubuntu环境构建,可忽略该文件):

# 使用官方的基础镜像作为起点
FROM ubuntu:20.04# 设置环境变量,避免交互式配置提示
ENV DEBIAN_FRONTEND=noninteractive# 设置工作目录
WORKDIR /app# 将当前目录下的所有文件复制到容器内的/app目录
COPY .. /app/
# 保持容器运行
CMD ["bash"]

ubuntu 安装grpc开始

1.安装相关的依赖工具和依赖包
# 安装pkg-config
sudo apt-get install pkg-config
# 安装依赖包
sudo apt-get install autoconf automake libtool make g++ unzip
sudo apt-get install libgflags-dev libgtest-dev
sudo apt-get install clang libc++-dev
#安装cmake(有的话可以不安装,最好保证cmake版本大于3.13,查看版本命令:cmake --version)
apt install cmake
#安装golang,(不同于其他人的安装依赖,但我在安装grpc时报错了缺乏golang的安装,这条命令你可以不执行,等待实际报错后执行)
apt install golang-go

源码编译:

#下载grpc源码
git clone  https://github.com/grpc/grpc.git
cd grpc
#切换到特定分支
git checkout 57586a1ca7f17b1916aed3dea4ff8de872dbf853

为何要特定分支?解决的issue如链接所述

**# 下载其依赖的子模块
git submodule update --init

编译构建protobuf(grpc依赖protobuf)

# 此时应在grpc文件夹下
cd third_party/protobuf/
# 更新依赖的子模块
git submodule update --init --recursive
# 生成配置脚本
sudo ./autogen.sh   
# 生成makefile文件
sudo ./configure
# 从makefile读取指令编译
sudo make
# 可能报错,但不影响安装
sudo make check
# 安装
sudo make install
# 更新共享库缓存
sudo ldconfig
# 查看安装的位置
which protoc
#查看是否安装成功
protoc --version

重新回去编译构建grpc环境

# 回到grpc的根目录
cd -
mkdir -p cmake/build
cd cmake/build
cmake ../..

如果cmake报错如下: Could not find Go
则使用前面我说的apt安装golang环境。 下面make -j8报错则替换成make(日志比较详细),make -j8 install同理换成make install

# 编译,并行编译,但是可能存在报错了日志不详细的问题,报错了建议换成make
make -j8

如果报错信息如下:

[ 93%] Building CXX object third_party/boringssl/crypto/CMakeFiles/crypto_test.dir/x509/x509_test.cc.o
/workspaces/demo/grpc/third_party/boringssl/crypto/x509/x509_test.cc: In member function 'virtual void X509Test_ZeroLengthsWithX509PARAM_Test::TestBody()':
/workspaces/demo/grpc/third_party/boringssl/crypto/x509/x509_test.cc:712:10: error: declaration of 'struct X509Test_ZeroLengthsWithX509PARAM_Test::TestBody()::Test' shadows a member of 'X509Test_ZeroLengthsWithX509PARAM_Test' [-Werror=shadow]712 |   struct Test {|          ^~~~
In file included from /workspaces/demo/grpc/third_party/boringssl/crypto/x509/x509_test.cc:19:
/workspaces/demo/grpc/third_party/boringssl/third_party/googletest/include/gtest/gtest.h:375:23: note: shadowed declaration is here375 | class GTEST_API_ Test {|                       ^
cc1plus: all warnings being treated as errors
make[2]: *** [third_party/boringssl/crypto/CMakeFiles/crypto_test.dir/build.make:635: third_party/boringssl/crypto/CMakeFiles/crypto_test.dir/x509/x509_test.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:3444: third_party/boringssl/crypto/CMakeFiles/crypto_test.dir/all] Error 2

详细报错信息
其实grpc官方已经解决了,但是我已经构建到了93%,如果继续换版本,不知道又会有哪些问题,因此我决定改源码,这个报错主要是因为 x509_test.cc 文件中的一个结构体声明与类成员函数名称冲突,并且由于启用了 -Werror 选项,警告被当作错误处理。具体来说,struct Test 声明与 X509Test_ZeroLengthsWithX509PARAM_Test 类的成员函数 TestBody 内部的 Test 结构体名称冲突。
因此直接改/workspaces/demo/grpc/third_party/boringssl/crypto/x509/x509_test.cc文件,该文件路径会在报错中展示,没展示的原因可能是你是并行构建,改成make可能会展示详细。

修改源码

vi /workspaces/demo/grpc/third_party/boringssl/crypto/x509/x509_test.cc

关键改动如下:均是Test -> TestStruct
在这里插入图片描述

#报错了则重新make
make
make -j8 install

测试是否安装成功,运行官方案例

#grpc根目录
cd examples/cpp/helloworld
mkdir build
cd build
# 编译
cmake ..
make -j8 

编译完成后,在文件夹下就生成了可执行文件,如图:
在这里插入图片描述
运行greeter_server服务

./greeter_server

在这里插入图片描述

自此grpc c++环境安装成功,并且可以将该docker生成个基础镜像,方便后续重复使用,后面就是docker相关的内容了,如果只是单纯在ubuntu构建的可以忽略后续步骤了。

ubuntu 安装grpc结束

构建Docker镜像开始

#查看正在运行的docker
docker ps

在这里插入图片描述
基于该docker构建镜像

# 6619ddff53f0换成你的container的id
docker commit 6619ddff53f0 ubuntu20.04-grpc:latest
#运行
docker run -d --name grpc-test  ubuntu20.04-grpc:latest
#进入容器内部(8c5a06f569be31d41b72fcfa8c5a68fab1edf78fa86d7f4a04ea5c3003ee9f44换成)
docker exec -it grpc-test /bin/bash

在这里插入图片描述

后续就是验证grpc配置在新环境是否有效,只需要git clone源码后编译examples/cpp/helloworld项目即可。
(在新环境你会发现你前面的grpc源码都没有了,是因为vscode是把用户路径映射到了容器内部,docker commit不会拷贝这个路径,借此可以很巧妙地生成grpc干净环境)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6344.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用KNN实现对鸢尾花数据集或者自定义数据集的的预测

创建自定义数据集: point1[[7.7,6.1],[3.1,5.9],[8.6,8.8],[9.5,7.3],[3.9,7.4],[5.0,5.3],[1.0,7.3]] point2[[0.2,2.2],[4.5,4.1],[0.5,1.1],[2.7,3.0],[4.7,0.2],[2.9,3.3],[7.3,7.9]] point3[[9.2,0.7],[9.2,2.1],[7.3,4.5],[8.9,2.9],[9.5,3.7],[7.7,3.7],[9.…

Go学习:常量

变量:程序运行期间,可以改变的量,变量声明需要使用 var 常量:程序运行期间,不可以改变的量,常量声明需要使用 const 目录 1. 常量不允许修改 2. 常量赋值不使用 : 3. 常量能够自动推导类型 1. 常量不允许…

钉钉群机器人设置——python版本

钉钉群机器人设置——python版本 应用场景钉钉界面操作程序开发效果展示 应用场景 由于工作需要,很多项目执行程序后出现报错信息无法第一时间收到,因此实时预警对于监控程序还是有必要。(仅个人观点) 参考文档及博客&#xff1a…

Effective Python系列(1.1):区别bytes和str

本篇文章是 Effective Python 这本书的第一章,本章的主要内容是什么样的代码风格才是比较符合 Python 语言。 在 Python 当中,bytes 和 str 是两种不同的数据结构。使用时,需要注意两者区别: bytes 包含的是由 8 位值所组成的序列…

vue + element-ui 组件样式缺失导致没有效果

失效 代码: 修改方法: 在main.js文件里面加上: import element-ui/lib/theme-chalk/index.css; 最后:

Formality:不可读(unread)的概念

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中有时会遇到不可读(unread)这个概念,本文就将对此…

机器学习 vs 深度学习

目录 一、机器学习 1、实现原理 2、实施方法 二、深度学习 1、与机器学习的联系与区别 2、神经网络的历史发展 3、神经网络的基本概念 一、机器学习 1、实现原理 训练(归纳)和预测(演绎) 归纳: 从具体案例中抽象一般规律…

OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯

目录 简述 什么是高通滤波? 高通滤波的概念 应用场景 索贝尔算子 算子公式 实现代码 特点 沙尔算子 算子公式 实现代码 特点 拉普拉斯算子 算子公式 实现代码 特点 高通滤波器的对比与应用场景 相关阅读 OpenCV:图像滤波、卷积与卷积核…

豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”

🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | 🐍 蛇年运势预测 在线体验地址:蛇年…

开源鸿蒙开发者社区记录

lava鸿蒙社区可提问 Laval社区 开源鸿蒙项目 OpenHarmony 开源鸿蒙开发者论坛 OpenHarmony 开源鸿蒙开发者论坛

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN ,以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…

简洁实用的wordpress外贸模板

简洁、实用、大气的wordpress外贸模板,适合跨境电商搭建外贸B2B产品展示型网站。 简洁实用的wordpress外贸模板 - 简站WordPress主题简洁、实用、大气的wordpress外贸模板,适合跨境电商搭建外贸B2B产品展示型网站。https://www.jianzhanpress.com/?p828…

编程界“华山论剑”:PHP与Go,谁主沉浮?

在编程的广阔天地里,选择一门合适的编程语言就如同为一场冒险挑选趁手的武器,至关重要却又常常令人纠结。当我们面对 PHP 与 Go 这两种备受瞩目的编程语言时,这种纠结愈发明显:PHP,作为 Web 开发领域的老牌劲旅&#x…

QT6 + CMAKE编译OPENCV3.9

参考文档 [1] https://blog.csdn.net/rjkf_css/article/details/135676077 前提条件 配置好相关运行环境:QT6、OPENCV3.9的sources文件 OPENCV下载网页:https://opencv.org/releases/ QT6下载教程:https://blog.csdn.net/caoshangpa/article…

Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具

我先说说文章标题中的“够用版”啥意思,为什么这么写。 按照我个人观点,在使用Python进行数据分析时,我们有时候肯定要结合到图表去进行分析,去直观展现数据的规律和特定,那么我们肯定要做一些简单的可视化&#xff0…

终极的复杂,是简单

软件仿真拥有最佳的信号可见性和调试灵活性,能够高效捕获很多显而易见的常见错误,被大多数工程师熟练使用。 空间领域应用的一套数据处理系统(Data Handling System),采用抗辐FPGA作为主处理器,片上资源只包含10752个寄存器,软仿也是个挺花时间的事。 Few ms might take …

青少年CTF练习平台 贪吃蛇

题目 CtrlU快捷键查看页面源代码 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>贪吃蛇游戏</title><style>#gameCanvas {border: 1px solid black;}</style> </head>…

Linux进度条实现

Linux进度条实现 1.\r\n2.缓冲区3.缓冲区分类4.进度条实现 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Linux的学习】 &#x1f4dd;&#x1f4dd;本篇内容&#xff1a;\…

服务器安装ESXI7.0系统及通过离线包方式升级到ESXI8.0

新到了一台物理服务器需要安装系统&#xff0c;项目不急用&#xff0c;先拿来做些实验。 本次实验目标&#xff1a; 1、在物理服务器上安装ESXI7.0系统&#xff1b; 2、通过离线包升级方式将ESXI7.0升级为ESXI8.0。 实验环境准备&#xff1a; 物理服务器1台&#xff0c;型号…

docker日志保留策略设置

docker日志保留策略设置 默认策略 默认情况下&#xff0c;docker使用json-file日志驱动&#xff0c;并且没有设置日志保留时间。 这意味着容器日志会一直保留在宿主机上&#xff0c;直到容器被删除或手动清理。如果不对日志进行限制&#xff0c;可能会导致磁盘空间被耗尽。 …