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.mzph.cn/bicheng/68958.shtml

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

相关文章

数据结构:二叉树—面试题(一)

目录 1、相同的树 2、另一棵树的子树 3、翻转二叉树 4、平衡二叉树 5、对称二叉树 6、二叉树遍历 7、二叉树的分层遍历 1、相同的树 习题链接https://leetcode.cn/problems/same-tree/description/https://leetcode.cn/problems/same-tree/description/ 描述&#xff1a…

MySQL训练营-慢查询诊断问题

慢查询相关参数和建议配置 slow_query_log long_query_time 日志开关,是否记慢查询日志以及超过多长时间判定为慢查询。 查看参数设置: SHOW VARIABLES LIKE ‘slow_query_log’;SHOW VARIABLES LIKE ‘long_query_time’; 实践建议: …

用edge浏览器追剧音量太小?安装音量增强器可解忧

0 源起 春节佳节将至,可以利用这个难得的假期追一追想看而没空看的剧了。 但是在用Edge浏览器播放网页中的视频时,有时音量太小,根本没法听清楚, 遇到这种情况时,尽管Edge浏览器本身没有提供音量控制功能&#xff0…

Linux-arm(1)ATF启动流程

Linux-arm(1)ATF启动流量 Author:Once Day Date:2025年1月22日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文档: ARM Trusted Firmware分析——启动、PSCI、OP-TEE接口 Arnold Lu 博…

解决docker: ‘buildx‘ is not a docker command.

简介 buildx 是 Docker 官方提供的一个构建工具,它可以帮助用户快速、高效地构建 Docker 镜像,并支持多种平台的构建。使用 buildx,用户可以在单个命令中构建多种架构的镜像,例如 x86 和 ARM 架构,而无需手动操作多个…

提示词工程(Prompt Engineering)

1. Prompt 是什么? Prompt:提示词,是描述 AI 需要执行的任务的自然语言文本。 如上图所示,Prompt就是用户的提问。其实我们大家都用过Prompt,比如我们使用的ChatGPT、文心一言、豆包等AI产品时的提问就是Prompt&…

【Linux】文件操作、系统IO相关操作、inode和输入输出重定向

⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作1.4 系统角度 2、系统文件IO2.1 文件相关操作2.2 文件描述符2.3 重定向 3、动静…

头像生成小程序搭建(免费分享)

如下图为小程序页面的基本效果&#xff0c;下面将介绍该小程序的功能 页面template代码如下&#xff1a; <template><view class"avatar-containner"><block v-if"!showCropper"><image class"pageback" src"../../s…

2025寒假备战蓝桥杯02---朴素二分查找升级版本的学习+分别求解左右端点

文章目录 1.朴素二分查找的升级版2.查找左端点3.查找右端点4.代码的编写 1.朴素二分查找的升级版 和之前介绍的这个二分查找相比&#xff0c;我觉得这个区别就是我们的这个二分查找需要找到的是一个区间&#xff0c;而不是这个区间里面的某一个元素的位置&#xff1b; 2.查找…

css命名规范——BEM

目录 引言 BEM是什么? 块Block 元素Element 修饰语Modifier BEM解决了哪些问题? 在流行框架的组件中使用 BEM 格式 实战 认识设计图 如何使用当前的css规范正确命名? 引言 css样式类命名难、太难了,难于上青天,这个和js变量命名还不一样。看看项目中五花八门的样…

C++AVL树(一)详解

文章目录 AVL树概念AVL树的插入平衡因子的更新旋转的规则左单旋右单旋抽象的情况h0h1h 2h 3 AVL树 概念 AVL树是一棵平衡二叉查找树&#xff0c;AVL树是空树&#xff0c;保证左右子树都是AVL树&#xff0c;AVL树要求高度差的绝对值不超过1&#xff0c;因为最好情况是1&#…

JAVA与数据结构-线性表

目录 一.线性表的概念 二.线性表的关系及分类 三.数组与顺序表 四.链表 1.静态链表(链表的的数组底层实现&#xff09; 2.循环链表 3.双向链表 五.栈 1.栈的概念 2.栈的底层实现 3.共享空间栈 4.逆波兰表达式&#xff08;后缀表达式&#xff09; 5.栈与递归 六.…

AI绘画:从灵感到杰作的奇幻之旅(3/10)

AI 绘画&#xff1a;新时代的艺术创作浪潮 在数字化时代的浪潮下&#xff0c;AI 绘画已成为艺术领域中一颗耀眼的新星&#xff0c;掀起了一场前所未有的创作革命。只需在相关工具中输入简单的文字描述&#xff0c;或者上传一张参考图片&#xff0c;就能迅速生成令人惊叹的艺术…

【C语言系列】深入理解指针(3)

深入理解指针&#xff08;3&#xff09; 一、字符指针变量二、数组指针变量2.1数组指针变量是什么&#xff1f;2.2数组指针变量怎么初始化&#xff1f; 三、二维数组传参的本质四、函数指针变量4.1函数指针变量的创建4.2函数指针变量的使用4.3两段有趣的代码4.4 typedef关键字 …

广东某海水取排水管线工程边坡自动化监测

1. 项目简介 广东廉江核电项目田螺岭厂址位于廉江市车板镇北约4km处&#xff0c;地理位置为东经10948’28.88“北纬2134’01.55”&#xff0c;东距廉江市约48km&#xff0c;东南距湛江市约 65km&#xff0c;厂址西南距离北部湾约4.5km。广东廉江核电项目一期工程海水取排水管线…

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序&#xff0c;界面是标准的 Windows 主从窗口 拥有&#xff1a;主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西&#xff0c;均在下图了。 开发该软件&#xff0c;主要分为下面三个阶段 1&#xff09;界面设计开发 多窗口 MDI 程序…

神经网络梯度爆炸的原因及解决方案

在深度学习中&#xff0c;梯度爆炸&#xff08;gradient exploding&#xff09;是一种常见的训练问题&#xff0c;尤其是在深层神经网络中。梯度爆炸指的是在反向传播过程中&#xff0c;梯度值呈指数级增长&#xff0c;导致网络权重的大幅更新&#xff0c;从而使得网络变得不稳…

deap系统重构,再新增一个新的因子,年化39.1%,卡玛提升至2.76(附python代码)

原创内容第776篇&#xff0c;专注量化投资、个人成长与财富自由。 本周核心工作之一&#xff0c;deap因子挖掘&#xff1a; Deap牛刀小试&#xff0c;挖掘出长期年化29.2%的轮动因子 deap时间序列函数补充&#xff0c;挖掘出年化39.12%的轮动因子&#xff0c;卡玛比率2.52 …

计算机图形学:实验二 三维模型读取与控制

一、程序功能设计 通过键盘和鼠标结合实现了对三维牛模型的变换控制&#xff0c;可以灵活调整旋转的轴、方向、速度以及暂停或复位三维牛模型状态。 动画启动和暂停&#xff1a; 按键&#xff1a;鼠标左键&#xff08;启动&#xff09;&#xff0c;鼠标右键&#xff08;暂停…

最新-CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机

CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机 一、前言二、设备要求三、环境要求四、安装4.1 环境安装4.2 JumpServer安装4.3 访问JumpServerWeb端&#xff0c;进行登录 五、登录Web控制台 一、前言 JumpServer是广受欢迎的开源堡垒机。运维必备神器&#xff01;JumpServe…