protobuf-c、組み込みプラットフォームでも利用可能!

protobuf-cとは

前回の記事「Protobuf:より小さく、より速く、より効率的なプロトコル」では、protobufとprotobuf-cについて詳しく紹介しました。ここに簡単な言及があります:

Protocol Buffers、XMLと同様に、Googleが開発したデータ形式であり、構造化データをシリアル化し、データストレージ、通信プロトコルなどに使用できます。protobufは一部の主流言語をサポートしていますが、Cをサポートしていないため、サードパーティのprotobuf-cが誕生しました。

前回の記事では、PCプラットフォームでのprotobufとprotobuf-cのインストールと使用について説明しました。このノートでは、組み込みARMプラットフォームで使用します。

protobuf-cをクロスコンパイルします

前回の記事では、PC環境にprotobufとprotobuf-cをインストールしました。

前回の記事の一般的な内容を簡単に確認しましょう。

このことから、ここでのprotobufの主な機能は、protocツールを生成することであり、protocツールの機能は、.protoファイルから対応するCソースファイルとヘッダーファイルを生成することであることがわかります。このプロセスはプラットフォームに依存しないため、ここで引き続き使用できます。

そして、protobuf-cは、コンパイルに必要な動的ライブラリを生成します。ここでは、ARMアーキテクチャの動的ライブラリをコンパイルする必要があります。つまり、このメモで行う必要があるのは次のとおりです。

(1)protobuf-cのクロスコンパイル

まず、protobuf-cディレクトリのmake cleanコマンドを使用して、前にコンパイルしたものをクリアします。

次のコマンドを入力して、クロスコンパイルされたMakefileを生成します。

左右にスワイプしてすべてのコードを表示>>>

./configure --host=arm-linux-gnueabihf CC=/home/book/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gcc CXX=/home/book/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g++ --disable-protoc --prefix=$PWD/tmp

このコマンドは非常に長いように見えますが、難しくはありません。いくつかの構成パラメーターを追加するだけです。これらの構成パラメーターについてどう思いますか?./configure --helpコマンドを入力して、サポートされている構成を表示できます。

上記の長いコマンドを順番に分析してみましょう。

  • --host = arm-linux-gnueabihf:最終的な実行可能ファイルが実行される環境を示します。

  • CC = / home / book / ToolChain / gcc-arm-linux-gnueabihf-6.2.1 / bin / arm-linux-gnueabihf-gcc:これは、クロスコンパイルツールarm-linux-gnueabihf-gccを指定し、ここに直接指定します。絶対パス。

  • CXX = / home / book / ToolChain / gcc-arm-linux-gnueabihf-6.2.1 / bin / arm-linux-gnueabihf-g ++:これは、クロスコンパイルツールarm-linux-gnueabihf-g ++を指定するためのものです。ここでは、直接提供します。絶対パスから。

  • --disable-protoc:protocを使用しないでください。protocツールによって.protoファイルから対応するCソースファイルとヘッダーファイルを生成するプロセスはプラットフォームに依存しないため、開発する場合を除いて、ここで使用する必要はありません。ボード上でProtocを使用していますが、トラブルが大きくなりますので、開発ボード上で直接使用することはお勧めしません。

  • --prefix = $ PWD / tmp:インストールパスを指定します。インストールパスが現在のパスの下のtmpフォルダーにあることを示します。

このコマンドを実行した後、クロスコンパイルされたMakefileを取得し、次のコマンドを入力してコンパイルおよびインストールします。

make
make install

このとき、armバージョンの関連ライブラリファイルは、現在のディレクトリのtmpフォルダに生成されます。

その中で最も重要なのはlibprotobuf-c.soこの動的ライブラリです。ファイルまたはreadelfツールを使用して、それがarm形式であるかどうかを確認できます。

明らかに、これはARMプラットフォームの動的ライブラリです。readelfの使用に関する関連記事:「ELFファイルの簡単な理解」

デモのデモンストレーションを始めましょう:

(2)protobuf-cのデモ例

1つをカスタマイズ.protoしてプロトコルデータを作成し、protoc-c工具コンパイルを使用してCコードを生成します。ヘッダーファイルとソースファイルの2つのファイルがあります。

たとえば、次のstudent.protoファイルを作成します。

syntax = "proto2";
 
message Student
{
    required string name    = 1;
    required uint32 num     = 2;
    required uint32 c_score = 3;
}

protoc-c工具ツールを使用してstudent.protoファイルをコンパイルします。

protoc --c_out=. student.proto

私たちのstudent.cテストデモを書いてください:

左右にスワイプしてすべてのコードを表示>>>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "student.pb-c.h"
 
int main(void)
{
    Student pack_stu = {0};
    uint8_t buffer[512] = {0};
    Student *unpack_stu = NULL;
    size_t len = 0;
 
    student__init(&pack_stu);
 
    /* 组包 */
    pack_stu.name = "ZhengN";
    pack_stu.num = 88;
    pack_stu.c_score = 90;
    len = student__pack(&pack_stu, buffer);
    printf("len = %ld\n",len);
 
    /* 解包 */
    unpack_stu = student__unpack(NULL, len, buffer);
    printf("unpack_stu.name = %s\n", unpack_stu->name);
    printf("unpack_stu.num = %d\n", unpack_stu->num);
    printf("unpack_stu.c_score = %d\n", unpack_stu->c_score);
 
    student__free_unpacked(unpack_stu, NULL);
    return 0;
}

デモは非常に簡単です。パッキングはプロトコルデータ構造を構築し、パックグループ化インターフェイスを呼び出してデータをバッファにスローします。アンパックはその逆で、バッファからデータを取得して構造に配置します。

現時点でのプロジェクトのファイルは次のとおりです。

クロスコンパイル:

左右にスワイプしてすべてのコードを表示>>>

arm-linux-gnueabihf-gcc student.c student.pb-c.c -o student -I /home/book/git_clone/protobuf-c/tmp/include -L /home/book/git_clone/protobuf-c/tmp/lib -lprotobuf-c

このコマンドも非常に長いように見えますが、実際には非常に単純です。

  • arm-linux-gnueabihf-gcc:クロスコンパイラ。

  • student.c student.pb-cc:入力ソースファイル。

  • 学生:生成された実行可能ファイル。

  • -I / home / book / git_clone / protobuf-c / tmp / include:ヘッダーファイルのパスを指定します。

  • -L / home / book / git_clone / protobuf-c / tmp / lib:ライブラリパスを指定します。

  • -lprotobuf-c:動的ライブラリlibprotobuf-c.soをリンクします。

ここで重要なことは、上記でコンパイルしたtmp / include内のファイルをクロスコンパイラヘッダーファイル検索パスにコピーし、tmp / lib内のファイルをクロスコンパイラライブラリファイル検索パスにコピーできることです。このように、このような長いパスの文字列を指定する必要はありません。

ただし、クロスコンパイラの独創性を保つために、何も追加しません。これらのリンクと動的ライブラリの詳細については、以前の記事「静的リンクと動的リンクの補足(Linux)」「動的リンクと静的リンクとは何ですか?」を参照してください。

コンパイルに問題がなければ、実行可能な学生学生を生成できます。

同様に、学生の実行可能ファイルの実行環境を確認できます。

それは私たちの腕の開発ボード上で実行できることがわかります。

次に、生徒を開発ボードにコピーして実行します。ここでは、WeiDongshan先生のIMX6ULL開発ボードを使用しています。

操作中に次のエラーが発生しました。

これは、共有ライブラリファイルlibprotobuf-c.so1が見つからず、ロードが失敗するためです。この問題については、「静的リンクと動的リンクの補足(Linux)」の記事で詳しく説明しています。

2つの解決策があります。1つはライブラリファイルをシステムライブラリのデフォルトの検索パスにコピーする方法、もう1つは現在のパスを動的ライブラリの検索パスに追加する方法です。

ここでは、2番目の方法を選択します。libprotobuf-c.soとlibprotobuf-c.so1もボードにアップロードし、学生と同じディレクトリに配置します。次に、次のコマンドを入力して、現在のパスを動的ライブラリの検索パスに追加します。

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH

次に、以下を実行します。

正常に実行してください!

上記は、組み込みLinuxプラットフォームで導入したprotobuf-cの使用法です(シングルチップマイクロコンピューターを学習している場合は、移植を試みることもできます)。エラーがある場合は、指摘していただき、ありがとうございます。加えて、

上記の2つの記事の手順によると、成功する可能性が高く、忍耐力が鍵となります。

経験の共有:Linuxの学習では、開発環境によって妨げられることがよくあります。多くの場合、他の人の方法や手順に従いますが、それを行うことはできません。精神性を崩壊させるのは簡単です。これは正常なことです。環境が異なるため、さまざまな依存関係が必要になる場合があります。しかし、私たちは十分な忍耐力を持っている必要があります、何が起こるか見てください!

その前に、私はまた、多くの問題に遭遇し、多くのブログ投稿を検索しました。したがって、これを利用して記事を学び、書くことができます。

この記事は、おそらく、組み込みLinuxプラットフォームでのprotobuf-cのクロスコンパイル、最も完全な手順、および最も多くの説明に関するネットワーク全体の最初の記事です。記事がお役に立てば、転送してください。ありがとうございました。


1.エラーフレームとCANの検出漏れ理解している場合、自動車工場はあなたを混乱させることはできません!

2. Gartnerは、2021年に重要な戦略的テクノロジートレンドをリリースします。

3.回路を設計するとき、どんな愚かなことが私たちの若者を泣かせますか...

4. Linux x86とARMの違いは何ですか?

5. STM32スタートアップファイルのいくつかの問題を調べます〜

6.生産にRustを使用している有名な企業とその選択理由!

免責事項:この記事はオンラインで複製されており、著作権は元の作者に帰属します。著作権の問題が発生した場合は、お問い合わせください。ご提供いただいた著作権証明書に基づいて著作権を確認し、作者の報酬を支払うか、コンテンツを削除します。

おすすめ

転載: blog.csdn.net/DP29syM41zyGndVF/article/details/110943882