grpc 1.45.2 在ubuntu中的編譯

要在 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…