在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            博客專欄

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

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

            發(fā)布人:美男子玩編程 時(shí)間:2024-06-21 來源:工程師 發(fā)布文章

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


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


            Protobuf優(yōu)點(diǎn)包括:

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

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

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

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


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


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


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

            和Protobuf-C。


            Protobuf 提供了 Protobuf 工具,用于將 .proto 文件轉(zhuǎn)換為 C 源代碼和頭文件,而 Protobuf-c 生成了編譯所需的動(dòng)態(tài)庫。


            圖片



            1


            開發(fā)環(huán)境和工具


            硬件環(huán)境

            臺(tái)灣聯(lián)詠NT96570BG


            軟件環(huán)境

            Ubuntu 18.04.6


            SDK

            na51055_linux_sdk-release.tar.gz


            交叉編譯工具鏈

            nvt-96570-toolchain.tar.gz


            Protobuf版本

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



            2


            安裝和編譯Protobuf、Protobuf-C庫


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

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

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


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


            1、安裝依賴項(xiàng)


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


            2、安裝Protobuf

            下載Protobuf V3.6.1,解壓后進(jìn)入文件夾,指令如下:







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


            含義如下:

            • cd protobuf: 進(jìn)入名為 protobuf 的目錄。

            • ./autogen.sh: 運(yùn)行 autogen.sh 腳本,用于生成 configure 配置腳本。

            • ./configure: 根據(jù)生成的配置腳本,配置編譯環(huán)境。

            • make: 編譯源代碼。

            • sudo make install: 安裝編譯生成的文件到系統(tǒng)中。

            • sudo ldconfig: 更新動(dòng)態(tài)鏈接庫緩存,使得系統(tǒng)能夠找到新安裝的庫文件。


            如果不需要使用指定版本的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: 進(jìn)入名為 protobuf-c 的目錄。

            • ./autogen.sh: 運(yùn)行 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: 配置編譯環(huán)境,指定目標(biāo)架構(gòu)為 arm-linux-gnueabihf,并使用指定的交叉編譯器進(jìn)行編譯。

            • make: 編譯源代碼。

            • sudo make install: 安裝編譯生成的文件到系統(tǒng)中。


            重點(diǎn)說一下configure配置編譯環(huán)境指令:

            • ./configure: 運(yùn)行配置腳本。

            • --host=arm-linux-gnueabihf: 指定目標(biāo)系統(tǒng)架構(gòu)為 arm-linux-gnueabihf,表示編譯生成的程序?qū)⒃?ARM 架構(gòu)上運(yùn)行。

            • 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 工具的構(gòu)建,這表示只編譯動(dòng)態(tài)庫,而不會(huì)生成 .proto 文件對應(yīng)的 C 源碼和頭文件。

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


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


            ./configure


            Protobuf、Protobuf-C默認(rèn)安裝在/usr/local路徑下:

            圖片


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


            protoc-c --version


            圖片


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


            圖片


            3


            編寫和編譯proto文件

            1、創(chuàng)建一個(gè)proto文件,文件命名為:LM_PCD_LD.proto,定義了一個(gè)消息類型:








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


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


            protoc --c_out=. LM_PCD_LD.proto.proto


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


            圖片



            4


            修改makefile文件

            1、添加頭文件路徑:

            圖片


            2、添加動(dòng)態(tài)鏈接庫路徑:

            圖片


            3、添加代碼路徑:

            圖片


            4、拷貝動(dòng)態(tài)庫到系統(tǒng)庫文件下:

            圖片



            5


            測試示例





























            #include #include "LM_PCD_LD.pb-c.h"
            int main() {    // 創(chuàng)建并初始化 Person 消息對象    Person person = PERSON__INIT;    person.name = "John Doe";    person.id = 1234;    person.email = "[email protected]";
               // 序列化消息對象    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);
               // 打印反序列化后的消息內(nèi)容    printf("Name: %sn", unpacked_person->name);    printf("ID: %dn", unpacked_person->id);    printf("Email: %sn", unpacked_person->email);
               // 釋放內(nèi)存    person__free_unpacked(unpacked_person, NULL);
               return 0;}


            *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。



            關(guān)鍵詞: 嵌入式 Linux Protobuf

            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉