博客專欄

        EEPW首頁 > 博客 > 嵌入式Linux:編譯和使用Protobuf庫

        嵌入式Linux:編譯和使用Protobuf庫

        發布人:美男子玩編程 時間:2024-06-21 來源:工程師 發布文章

        Protobuf(Protocol Buffers)是由 Google 開發的一種輕量級、高效的結構化數據序列化方式,用于在不同應用之間進行數據交換和存儲。它可以用于多種編程語言,并支持自動生成代碼,使得數據結構定義和序列化/反序列化過程更加簡潔和高效。


        Protobuf-C 是 Protocol Buffers 的 C 語言實現,它專門針對 C 語言環境進行了優化,提供了類似于官方實現的功能,同時支持與其他語言生成的 Protobuf 數據進行交互。Protobuf-C 生成的庫文件可以被 C 語言項目使用,使得在 C 語言環境中進行高效的數據序列化和反序列化成為可能。


        Protobuf優點包括:

        • 高效性:protobuf 生成的數據格式通常比 XML 和 JSON 更加緊湊,序列化和反序列化速度更快。

        • 可擴展性:支持向已有消息類型添加新的字段或消息,而不破壞向后兼容性。

        • 語言無關性:protobuf 支持多種編程語言,包括 C++, Java, Python, Go, 和 C# 等。

        • 自動代碼生成:通過 .proto 文件定義消息格式后,可以使用編譯器自動生成目標語言的代碼,簡化開發工作。


        Protobuf代碼倉庫:https://github.com/protocolbuffers/protobuf


        Protobuf-C代碼倉庫:https://github.com/protobuf-c/protobuf-c


        由于我需要在SoC開發板上使用C語言版的Protobuf庫,所以需要使用到Protobuf

        和Protobuf-C。


        Protobuf 提供了 Protobuf 工具,用于將 .proto 文件轉換為 C 源代碼和頭文件,而 Protobuf-c 生成了編譯所需的動態庫。


        圖片



        1


        開發環境和工具


        硬件環境

        臺灣聯詠NT96570BG


        軟件環境

        Ubuntu 18.04.6


        SDK

        na51055_linux_sdk-release.tar.gz


        交叉編譯工具鏈

        nvt-96570-toolchain.tar.gz


        Protobuf版本

        V3.6.1(SoC需要和上位機通信,保持雙方版本一致)



        2


        安裝和編譯Protobuf、Protobuf-C庫


        SoC編譯和使用Protobuf庫有2種方式:

        • 下載Protobuf、Protobuf-C源碼,集成到SoC SDK包中,修改makefile文件和相關配置,每次編譯SDK固件時,也會編譯和生成Protobuf所需的庫和文件。

        • 在Ubuntu系統下載和編譯Protobuf、Protobuf-C源碼,將編譯好的庫和文件拷貝到SoC APP應用工程中,修改makefile文件和相關配置,直接使用。


        這里我們使用第二種方式。


        1、安裝依賴項


        sudo apt-get install autoconf automake libtool curl make g++ unzip pkg-config


        2、安裝Protobuf

        下載Protobuf V3.6.1,解壓后進入文件夾,指令如下:







        cd protobuf./autogen.sh./configuremakesudo make installsudo ldconfig


        含義如下:

        • cd protobuf: 進入名為 protobuf 的目錄。

        • ./autogen.sh: 運行 autogen.sh 腳本,用于生成 configure 配置腳本。

        • ./configure: 根據生成的配置腳本,配置編譯環境。

        • make: 編譯源代碼。

        • sudo make install: 安裝編譯生成的文件到系統中。

        • sudo ldconfig: 更新動態鏈接庫緩存,使得系統能夠找到新安裝的庫文件。


        如果不需要使用指定版本的Protobuf,可以使用git指令下載庫:


        git clone https://github.com/protocolbuffers/protobuf.git

        3、安裝protobuf-c

        protobuf-c不需要指定版本,直接使用git指令下載倉庫,指令如下:







        git clone https://github.com/protobuf-c/protobuf-c.gitcd protobuf-c./autogen.sh./configure --host=arm-linux-gnueabihf CC=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-gcc CXX=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-g++ --disable-protoc --prefix=$PWD/tmp_outmakesudo make install


        含義如下:

        • cd protobuf-c: 進入名為 protobuf-c 的目錄。

        • ./autogen.sh: 運行 autogen.sh 腳本,用于生成 configure 配置腳本。

        • ./configure --host=arm-linux-gnueabihf CC=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-gcc CXX=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-g++ --disable-protoc --prefix=$PWD/tmp_out: 配置編譯環境,指定目標架構為 arm-linux-gnueabihf,并使用指定的交叉編譯器進行編譯。

        • make: 編譯源代碼。

        • sudo make install: 安裝編譯生成的文件到系統中。


        重點說一下configure配置編譯環境指令:

        • ./configure: 運行配置腳本。

        • --host=arm-linux-gnueabihf: 指定目標系統架構為 arm-linux-gnueabihf,表示編譯生成的程序將在 ARM 架構上運行。

        • CC=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-gcc: 指定 C 編譯器為 /opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-gcc,即指定了交叉編譯器。

        • CXX=/opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-g++: 指定 C++ 編譯器為 /opt/arm/arm-ca9-linux-gnueabihf-6.5/usr/bin/arm-ca9-linux-gnueabihf-g++,即指定了交叉編譯器。

        • --disable-protoc: 禁用 protoc 工具的構建,這表示只編譯動態庫,而不會生成 .proto 文件對應的 C 源碼和頭文件。

        • --prefix=$PWD/tmp_out: 指定安裝路徑為當前目錄下的 tmp_out 目錄。


        如果不是ARM SoC使用,只是Ubuntu系統使用,配置編譯環境就無需指定交叉編譯工具鏈,指令如下:


        ./configure


        Protobuf、Protobuf-C默認安裝在/usr/local路徑下:

        圖片


        使用指令可以查看Protobuf、Protobuf-C的版本,指令如下:


        protoc-c --version


        圖片


        編譯Protobuf-c代碼時,指定了鏈接庫輸出在當前目錄下的 tmp_out 目錄。將編譯輸出物都拷貝到SoC APP應用工程中。


        圖片


        3


        編寫和編譯proto文件

        1、創建一個proto文件,文件命名為:LM_PCD_LD.proto,定義了一個消息類型:








        syntax = "proto3";
        message Person {  string name = 1;  int32 id = 2;  string email = 3;}


        2、使用 Protobuf 編譯器(protoc)生成對應的C代碼:


        protoc --c_out=. LM_PCD_LD.proto.proto


        編譯生成:LM_PCD_LD.pb-c.c和LM_PCD_LD.pb-h文件。將文件拷貝到SoC APP應用工程中。


        圖片



        4


        修改makefile文件

        1、添加頭文件路徑:

        圖片


        2、添加動態鏈接庫路徑:

        圖片


        3、添加代碼路徑:

        圖片


        4、拷貝動態庫到系統庫文件下:

        圖片



        5


        測試示例





























        #include #include "LM_PCD_LD.pb-c.h"
        int main() {    // 創建并初始化 Person 消息對象    Person person = PERSON__INIT;    person.name = "John Doe";    person.id = 1234;    person.email = "johndoe@example.com";
           // 序列化消息對象    size_t packed_size = person__get_packed_size(&person);    uint8_t buffer[packed_size];    person__pack(&person, buffer);
           // 反序列化消息對象    Person *unpacked_person = person__unpack(NULL, packed_size, buffer);
           // 打印反序列化后的消息內容    printf("Name: %sn", unpacked_person->name);    printf("ID: %dn", unpacked_person->id);    printf("Email: %sn", unpacked_person->email);
           // 釋放內存    person__free_unpacked(unpacked_person, NULL);
           return 0;}


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: 嵌入式 Linux Protobuf

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 黄浦区| 盖州市| 鄱阳县| 滦南县| 金寨县| 龙岩市| 保康县| 海伦市| 西昌市| 井陉县| 射洪县| 镇安县| 乌兰察布市| 红河县| 泸水县| 攀枝花市| 南岸区| 手机| 乐都县| 体育| 杂多县| 汉中市| 哈密市| 九龙坡区| 高唐县| 托里县| 彭阳县| 兰考县| 左权县| 龙州县| 虹口区| 柳州市| 洛浦县| 亳州市| 驻马店市| 广昌县| 吉首市| 宾川县| 花莲县| 新闻| 高清|