要在 Ubuntu 上编译 gRPC 1.45.2,需要按照以下步骤操作。以下指南基于 gRPC 官方文档和相关资源,确保环境配置正确并成功编译。请确保你有管理员权限(sudo)以安装依赖项和执行相关命令。


1. 准备环境

确保你的 Ubuntu 系统已安装必要的工具和依赖项。以下是编译 gRPC 所需的工具:

bash

sudo apt update

sudo apt install -y build-essential autoconf libtool pkg-config cmake git

sudo apt install -y libssl-dev

此外,gRPC 依赖 Protocol Buffers(protobuf),需要安装 protobuf-compiler 和 libprotobuf-dev:

bash

sudo apt install -y protobuf-compiler libprotobuf-dev

2. 克隆 gRPC 仓库

gRPC 1.45.2 是一个较老的版本,因此需要从 GitHub 克隆指定版本的代码:

bash

git clone --recurse-submodules -b v1.45.2 --depth 1 --shallow-submodules https://github.com/grpc/grpc.git

cd grpc

  • --recurse-submodules:确保子模块(如 Protocol Buffers)被正确克隆。
  • -b v1.45.2:指定 gRPC 的 1.45.2 版本。
  • --depth 1 --shallow-submodules:减少克隆的数据量以加快下载。

3. 创建构建目录

在 gRPC 仓库目录中创建并进入构建目录:

bash

mkdir -p cmake/build

cd cmake/build

4. 配置 CMake

使用 CMake 配置 gRPC 的构建。以下是一个典型的配置命令,假设你希望将 gRPC 安装到自定义目录(例如 $HOME/grpc_install):

bash

cmake -DgRPC_INSTALL=ON \

-DgRPC_BUILD_TESTS=OFF \

-DCMAKE_CXX_STANDARD=17 \

-DCMAKE_INSTALL_PREFIX=$HOME/grpc_install \

../..

  • -DgRPC_INSTALL=ON:启用安装选项。
  • -DgRPC_BUILD_TESTS=OFF:禁用测试以加快构建。
  • -DCMAKE_CXX_STANDARD=17:设置 C++17 标准(gRPC 1.45.2 支持)。
  • -DCMAKE_INSTALL_PREFIX:指定安装目录(可根据需要修改)。

注意:如果希望使用系统安装的 Protocol Buffers,可以添加以下选项以避免编译 gRPC 内置的 protobuf:

bash

-DgRPC_PROTOBUF_PROVIDER=package \

-DgRPC_PROTOBUF_PACKAGE_TYPE=CONFIG \

-DProtobuf_ROOT=/usr

但需要确保系统安装的 Protocol Buffers 版本与 gRPC 1.45.2 兼容(建议使用 3.12.x 或更高版本)。否则,建议使用 gRPC 仓库中自带的 Protocol Buffers 子模块。

5. 编译 gRPC

运行以下命令进行编译:

bash

make -j$(nproc)

  • -j$(nproc):利用所有 CPU 核心加速编译。

编译可能需要几分钟,具体时间取决于你的硬件性能。

6. 安装 gRPC

编译完成后,安装 gRPC 到指定目录:

bash

make install

这会将 gRPC 的库、头文件和工具安装到 CMAKE_INSTALL_PREFIX 指定的目录(例如 $HOME/grpc_install)。

7. 验证安装

验证 gRPC 是否成功安装:

bash

# 检查 protoc 插件

$HOME/grpc_install/bin/grpc_cpp_plugin --version

如果输出类似 libprotoc 3.x.x,说明安装成功。

8. 环境变量配置

为了让系统找到 gRPC 的库和工具,需要将安装目录添加到环境变量:

bash

export PATH=$PATH:$HOME/grpc_install/bin

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/grpc_install/lib

可以将上述命令添加到 ~/.bashrc 或 ~/.bash_profile 以永久生效:

bash

echo "export PATH=\$PATH:$HOME/grpc_install/bin" >> ~/.bashrc

echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:$HOME/grpc_install/lib" >> ~/.bashrc

source ~/.bashrc

9. 常见问题及解决方法

  • 问题 1:CMake 找不到 Protocol Buffers。
    • 确保已安装 libprotobuf-dev 和 protobuf-compiler。
    • 如果使用系统 protobuf,确保版本兼容,或者移除 -DgRPC_PROTOBUF_PROVIDER=package 让 gRPC 使用内置的 protobuf 子模块。
    • 如果仍失败,可尝试手动安装 Protocol Buffers 3.12.x:

      bash

      wget https://github.com/protocolbuffers/protobuf/releases/download/v3.12.4/protoc-3.12.4-linux-x86_64.zip

      sudo unzip -o protoc-3.12.4-linux-x86_64.zip -d /usr/local bin/protoc

      sudo unzip -o protoc-3.12.4-linux-x86_64.zip -d /usr/local 'include/*'

  • 问题 2:编译失败,提示缺少依赖。
    • 检查是否遗漏了 libssl-dev 或其他依赖。
    • 运行 sudo ldconfig 确保系统使用最新的库版本。
    •  
  • 问题 3:CMake 报错缺少 .cmake 文件。
    • 确保 git clone 时使用了 --recurse-submodules,否则子模块可能缺失。
    • 如果仍然失败,尝试使用 Bazel 构建(参考 gRPC 官方 BUILDING.md)。

10. 测试 gRPC

可以运行 gRPC 提供的示例来验证编译结果:

bash

cd ~/grpc/examples/cpp/helloworld

make

./greeter_server &

./greeter_client

如果客户端成功输出类似 Greeter received: Hello world,说明 gRPC 已正确编译和运行。


参考资源

  • gRPC 官方 C++ 快速入门:Quick start | C++ | gRPC
  • Protocol Buffers 安装指南:Protocol Buffers Documentation
  • Ubuntu 安装 protobuf 讨论:https://askubuntu.com/questions/1065971/how-can-i-install-protoc-on-ubuntu-16-04

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

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

相关文章

lesson45:Linux基础入门指南:从内核到实践操作全解析

目录 一、Linux简介与核心概念 1.1 Linux的起源与发展 1.2 内核与发行版的关系 二、Linux内核版本解析 2.1 内核版本命名规则 2.2 2025年主流内核版本 三、主流Linux发行版对比 3.1 桌面用户首选 Ubuntu 24.04 LTS Linux Mint 22 3.2 技术爱好者之选 Fedora 41 Ar…

PCL点云库入门(第24讲)——PCL库点云特征之NARF特征描述 Normal Aligned Radial Feature(NARF)

一、算法原理 1、NARF 特征概述 NARF(Normal Aligned Radial Feature)是 2011 年由 Bastian Steder 等人在论文 《Point Feature Extraction on 3D Range Scans Taking into Account Object Boundaries》中提出的一种 稀疏局部 3D 特征描述子。 核心目标是提取具有“边界意…

使用 eventpp 构建跨 RT-Thread 与 ARM-Linux 的轻量级 Active Object(AO)事件驱动框架

0. 引言 本文展示一个实践路径:以轻量级 C 事件库 eventpp 为核心,设计并实现一个面向嵌入式的、可移植的 Active Object(AO)事件驱动架构。该架构满足以下目标: 跨平台兼容:单套代码在 RT-Thread&#xff…

【python实用小脚本-193】Python全能PDF小助手:剪切/合并/旋转/加密一条龙——再也不用开会员

Python全能PDF小助手:剪切/合并/旋转/加密一条龙——再也不用开会员 PDF编辑, 本地处理, 零会员费, 多功能脚本, 瑞士军刀 故事开场:一把瑞士军刀救了周五下班的你 周五 17:55,老板甩来一堆 PDF: “把第 3、7 页删掉”“再和合同合…

Ubuntu根分区扩容

目录 1.先查看/dev/sda 整块磁盘设备的分区占用情况: 2.在VMware中编辑虚拟机: 3.进入虚拟机,进入disk应用程序: 4.扩容文件系统 5.最后通过df-h lsblk或通过可视化GParted进行验证。 1.先查看/dev/sda 整块磁盘设备的分区占…

智慧城市SaaS平台/市政设施运行监测系统之空气质量监测系统、VOC气体监测系统、污水水质监测系统及环卫车辆定位调度系统架构内容

1. 空气质量监测系统1) 监测点管理 a) 监测点基本信息 支持记录空气质量监测点的名称、位置、类型、设备配置等信息。 b) 监测点分布地图 支持通过GIS地图展示监测点的分布情况,支持地图查询和导航。 2) 空气质量监测 a) 实时数据采集 支持实时采集空气质量数据&…

PiscCode迅速集成YOLO-Pose 实现姿态关键点轨迹跟踪应用

在计算机视觉领域,人体姿态检测与轨迹跟踪是很多应用场景的核心技术,例如运动分析、行为识别、智能监控等。本文将介绍如何在 PiscCode 平台上,利用 YOLO-Pose 模型进行姿态估计,并实现多人关键点轨迹跟踪。 一、什么是 PiscCode …

HTTP的状态码有哪些,并用例子说明一下

问题HTTP的状态码有哪些,并用例子说明一下我的回答HTTP状态码是服务器对客户端请求的响应码,它们按照不同的功能被分为五大类。我来介绍一下主要的状态码及其实际应用场景:1xx(信息性状态码):表示请求已接收…

【51单片机】【protues仿真】基于51单片机宠物投食器系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、LCD1602液晶显示当前时间 2、按键设置时间,5个定时投喂时间​ 3、可以通过手动按键进行投喂食物 4、步进电机模拟投喂食物 二、使用步骤 基于51单片机的宠物自动投…

掌握设计模式--命令模式

命令模式(Command Pattern) 命令模式(Command Pattern)是一种行为型设计模式,它将请求(命令)封装成对象,从而使您能够参数化客户端(调用者)使用不同的请求、…

STM32之beep、多文件、延迟、按键以及呼吸灯

一、Beep控制 原理图分析: 蜂鸣器三极管控制引脚对应 MCU PB8。当前蜂鸣器对应的电路中,三极管是 NPN 三极管,当前【基极】存在小电流,当前三极管导通。要求对应 PB8 引脚对外输出电压 / 电流。当前 PB8 输出高电平,当…

C++的struct里面可以放函数,讨论一下C++和C关于struct的使用区别

我们来看一个C代码下面的struct结构体: struct UserValue {float lx;float ly;float rx;float ry;float L2;// 【构造函数】UserValue() {setZero();}// 【成员函数】void setZero() {lx 0;ly 0;rx 0;ry 0;L2 0;} };在这篇文章中,我们将来详细解释一下为什么 U…

【Kubernetes知识点】资源配额与访问控制

目录 1.解释ResourceQuota的作用。 2.解释Service Account的用途。 3.详细解释Role和ClusterRole。 4.什么是K8s的NetworkPolicy? 5.详细描述在K8s中如何控制跨Namespace的Pod访问? 1.解释ResourceQuota的作用。 ResourceQuota(资源配额…

在SAP Query中添加双击事件

在SAP系统中,SAP Query是一个强大的工具,允许用户自定义报告以满足特定的数据查询需求。它提供了灵活的报表设计功能,使非编程背景的用户也能创建和修改查询。在某些情况下,我们可能希望在查询结果上添加交互性,比如通…

c++:MFC中sqlite3的使用(附实际案例)

MFC中sqlite3的使用sqlite3介绍sqlite3安装常用API函数操作流程接口函数执行sql语句函数回调函数MFC中案例实践控制台实践sqlite3介绍 SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL …

LeetCode第1019题 - 链表中的下一个更大节点

题目 解答 class Solution {Stack<Integer> stack new Stack<>();List<Integer> values new LinkedList<>();public int[] nextLargerNodes(ListNode head) {nextLargerNodes2(head);return values.stream().mapToInt(x -> x).toArray();}publi…

STM32 硬件I2C读写MPU6050

本文代码基于 STM32 单片机&#xff0c;通过 I2C 总线驱动 MPU6050 六轴传感器&#xff08;集成加速度计与陀螺仪&#xff09;&#xff0c;实现传感器初始化、ID 读取、原始数据采集&#xff0c;并借助 OLED 显示屏实时展示加速度&#xff08;AccX、AccY、AccZ&#xff09;与角…

倍福下的EC-A10020-P2-24电机调试说明

今天调试EC-A10020-P2-24电机&#xff0c;采用力位混合控制指令进行控制&#xff0c;无前馈力矩&#xff0c;只调节Kp和Kd,跟踪红色轨迹&#xff08;正弦信号&#xff1a;幅值10&#xff0c;频率0.5Hz&#xff09;&#xff0c;结果显示Kp 180, Kd 40&#xff0c;实际上Kp进一步…

SQL注入1----(sql注入原理)

一.前言前面我们讲解了一下信息收集&#xff0c;本章节我们来讲解一下sql注入的基本原理&#xff0c;我们拿之前搭建的测试网站pikachu来测试&#xff0c;对应工具包也已经放在了工具里面&#xff0c;大家可以自行去下载。SQL注入攻击漏洞的原因&#xff0c;是由于程序员在编写…

C++智能指针详解:用法与实践指南

C智能指针详解&#xff1a;用法与实践指南 在C编程中&#xff0c;动态内存管理始终是开发者面临的重要挑战。手动分配和释放内存不仅繁琐&#xff0c;还容易因疏忽导致内存泄漏、悬垂指针等问题。为解决这些痛点&#xff0c;C标准库引入了智能指针&#xff08;Smart Pointers&a…