簡體   English   中英

如何使用 nanopb 和 protobuf 將 nanopb .proto 文件編譯成 .h 和 .c 文件(`protoc` 編譯問題)

[英]How to compile nanopb .proto file into .h and .c files using nanopb and protobuf (`protoc` compile question)

舊標題:如何使用 nanopb 和 protobuf 將 nanopb/examples/simple/simple.proto 文件編譯成 simple.h 和 simple.c

關於這個庫: https : //github.com/nanopb/nanopb

我的目標是遵循本教程: https : //jpa.kapsi.fi/nanopb/docs/concepts.htmlnanopb/examples/simple/simple.proto轉換為 .h 和 .c 源文件。 我需要簡單的說明才能在 Ubuntu 上執行此操作。 我已經嘗試了幾天,但無法讓它工作。

教程說要做的命令是:

protoc -omessage.pb message.proto
python ../generator/nanopb_generator.py message.pb

我克隆了 nanopb 存儲庫,將其放入nanopb/examples/simple ,然后在上面的命令中替換為simple.proto而不是message.proto ,我運行了以下命令:

protoc -osimple.pb simple.proto

它運行良好,生成了一個 simple.pb 文件。

然而,第二部分失敗了。 nanopb/examples/simple文件夾中運行時,我得到:

$ python ../../generator/nanopb_generator.py simple.pb

         ********************************************************************
         *** Failed to import the protocol definitions for generator.     ***
         *** You have to run 'make' in the nanopb/generator/proto folder. ***
         ********************************************************************

Traceback (most recent call last):
  File "../../generator/nanopb_generator.py", line 39, in <module>
    import proto.nanopb_pb2 as nanopb_pb2
  File "/home/gabriels/GS/dev/Protocol_Buffers/Nanopb/source/nanopb/generator/proto/nanopb_pb2.py", line 11, in <module>
    from google.protobuf import symbol_database as _symbol_database
ImportError: cannot import name symbol_database

運行make什么都不做(說它已經完成了):

nanopb/generator/proto $ make
make: Nothing to be done for `all'.

請注意,我正在運行最新版本的protoc ,它是從 Google protobuf repo 的源代碼構建的: https : //github.com/protocolbuffers/protobuf

我也在這里向 nanopb 尋求幫助,但我無法弄清楚,並且覺得這里有一些基本的東西我錯過了,因為我知道的還不夠多: https : //github.com/nanopb/nanopb/issues /417 感覺就像我在一些應該很簡單的事情上撞牆,並且在我之前已經至少有 1448+ 人做過(nanopb 上的星星數量)。

解決了。 @PetteriAimonen 給了我丟失的線索

protoc 版本需要與 python 庫版本匹配

然后我突然想到:最初,從頭開始編譯 protobuf 時,我只遵循 C++ 安裝說明,如下所示: https : //github.com/protocolbuffers/protobuf/tree/master/src 但是,如果我也遵循 Python 安裝說明呢? https://github.com/protocolbuffers/protobuf/tree/master/python

所以,這就是我所做的。

TLDR; 也進行protobuf庫的 Python 安裝(不僅僅是 C++ 安裝):

我遵循的 Protobuf Python 安裝步驟:

python -V # See if I have Python 2.7 or newer (I must to continue)
cd protobuf/python # cd into Python source directory
python setup.py build
python setup.py test
(cd .. && make)
(cd .. && sudo make install)
python setup.py build --cpp_implementation
python setup.py test --cpp_implementation  # look to see all tests pass
sudo python setup.py install

.proto 文件的兩步編譯:

這一切都奏效了,所以現在讓我們返回並再次嘗試編譯我們的 simple.proto 文件。

cdnanopb/examples/simple 我們已經運行了第一個命令來生成 simple.pb 文件,所以現在只需運行之前會失敗的第二個命令,它就可以工作了!

僅第二個命令:

nanopb/examples/simple $ python ../../generator/nanopb_generator.py simple.pb

輸出:

 nanopb/examples/simple $ python ../../generator/nanopb_generator.py simple.pb Writing to simple.pb.h and simple.pb.c

為完整起見,將 2 個命令再次顯示在一起:

protoc -osimple.pb simple.proto
nanopb/examples/simple $ python ../../generator/nanopb_generator.py simple.pb

美麗的! 有效! simple.pb.hsimple.pb.c現已創建!

現在構建“簡單”項目:

make

並運行它:

./simple

輸出是:

 nanopb/examples/simple $ ./simple Your lucky number was 13!

現在我可以研究項目,看看simple.proto是如何變成simple.pb.hsimple.pb.c 的,我可以研究simple.c (其中包含main()函數)來查看這些的完整用法自動生成的 .h 和 .c 文件,包括查看以下頭文件,其中包括:

#include <pb_encode.h> # found up 2 levels, in "nanopb" folder
#include <pb_decode.h> # found up 2 levels, in "nanopb" folder
#include "simple.pb.h" # just generated right here in "nanopb/examples/simple" folder

構建 .proto 文件的一行命令:

而不是執行兩行命令來構建 .proto 文件

# From inside folder "/home/gabriels/GS/dev/Protocol_Buffers/Nanopb/source/nanopb/examples/simple":
protoc -osimple.pb simple.proto
python ../../generator/nanopb_generator.py simple.pb

我們可以做一個行命令構建.proto剛剛使用的文件protoc可執行加上protoc-gen-nanopb插件:

protoc --plugin=protoc-gen-nanopb=/home/gabriels/GS/dev/Protocol_Buffers/Nanopb/source/nanopb/generator/protoc-gen-nanopb --nanopb_out=. simple.proto

然后,當然,我們仍然需要制作並運行主 C 項目:

# From inside folder "/home/gabriels/GS/dev/Protocol_Buffers/Nanopb/source/nanopb/examples/simple":
make && ./simple

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM