- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
旧标题:如何使用nanopb和protobuf将nanopb/examples/simple/simple.proto文件编译成simple.h和simple.c
关于这个库:https://github.com/nanopb/nanopb
我的目标是遵循本教程:https://jpa.kapsi.fi/nanopb/docs/concepts.html将 nanopb/examples/simple/simple.proto 转换为 .h 和 .c 源文件。我需要简单的说明才能在 Ubuntu 上执行此操作。我已经尝试了好几天了,但无法让它发挥作用。
本教程说要执行的命令是:
protoc -omessage.pb message.proto
python ../generator/nanopb_generator.py message.pb
我克隆了 nanopb 存储库,cd 到 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 存储库构建的,来源为:https://github.com/protocolbuffers/protobuf .
我也曾在这里寻求 nanopb 的帮助,但我无法弄清楚,感觉这里缺少一些基本的东西,因为我知道的不够多:https://github.com/nanopb/nanopb/issues/417 .感觉我正在努力做一些应该很简单并且在我之前至少有 1448 多人已经完成的事情(nanopb 上的星星数量)。
最佳答案
已解决。 @PetteriAimonen 有 given me the missing clue :
the protoc version needs to match with the python library version
然后我想到:最初,当从头开始编译 protobuf 时,我只遵循 C++ 安装说明,如下所示:https://github.com/protocolbuffers/protobuf/tree/master/src .但是,如果我也遵循 Python 安装说明怎么办? https://github.com/protocolbuffers/protobuf/tree/master/python
所以,这就是我所做的。
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
一切正常,所以现在让我们返回并再次尝试编译我们的 simple.proto 文件。
cd
进入 nanopb/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.h 和 simple.pb.c 现已创建!
现在构建“简单”项目:
make
然后运行它:
./simple
输出是:
nanopb/examples/simple $ ./simple
Your lucky number was 13!
现在我可以研究这个项目,看看 simple.proto 是如何变成 simple.pb.h 和 simple.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 文件:
# 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
关于c - How to compile nanopb .proto file into .h and .c files using nanopb and protobuf (`protoc` 编译问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57367265/
我一直在尝试使用 protoc cli 实用程序对字符串进行编码。 注意到输出仍然包含纯文本。 我究竟做错了什么? osboxes@osboxes:~/proto/bin$ cat ./teststr
要为 Python 编译 proto 文件,我可以 protoc -I=.--python_out=$DST_DIR sommem.proto 基于 https://developers.google
如何查看protoc-gen-go和protoc-gen-validate的版本? protoc-gen-go --version protoc-gen-validate --version 我试过上
我们使用的是 protoc-gen-go v2(v2 是 google.golang.org/protobuf,v1 是 github.com/golang/protobuf) 当我们尝试编译 gRP
我正在尝试用 C++ 生成 Google Assistant 库。 我已经使用 protoc 编译器编译了 embedded_assistant.proto 文件,并获得了用于库的 embedded_
我想使用来自 protoc-gen-grpc-kotlin 的 protoc-gen-grpc-kotlin-1.0.0我得到了 Execution failed for task ':generat
我想使用来自 protoc-gen-grpc-kotlin 的 protoc-gen-grpc-kotlin-1.0.0我得到了 Execution failed for task ':generat
我只是想使用 Protocol Buffer 为 golang 生成代码。但是无法使用 protoc 命令生成服务。 syntax = "proto3"; package greet; option
我正在尝试构建一个自定义协议(protocol)插件来从 .proto 文件生成自定义输出。我从 protoc custom plugin 复制了包含 CodeGenerator 的 java 文件作
protoc-gen-doc 自定义模板规则详解 配套演示工程 此项目中所用 proto 文件位于 ./proto 目录下,来源于 官方proto示例 此项目中所列所有
我正在尝试运行: protoc *.proto -python_out=. 在 tensorflow > models > research > object_detection > protos 内
我想使用 protoc生成java文件的命令 我一直在遵循来自 github https://github.com/protocolbuffers/protobuf 的自述文件中的说明但它只是告诉您下
我想实现dart-protobuf,但是dart-protoc-plugin(从proto定义生成Dart protobuf库的项目)当前不支持Windows。我找不到该插件的替代品。没有其他方法可以
问题: 我在根目录中有 2 个文件。 我使用 Makefile 从 .proto 文件生成 Go 代码。 但是 Video 结构中的语言字段是一个值,而不是指向该值的指针。 Video 结构中的 su
我正在尝试在 How to write a custom Protobuf CodeGenerator in Java 制作工作示例。当我尝试使用编译文件时 import com.google.pro
当我运行这个时: protoc --python_out=. .\object_detection\protos\anchor_generator.proto 在命令行上的 tensorflow 对象
我正在尝试开发一个插件,以便自动生成特定于我的应用程序的代码。虽然一个可能更简单的策略是让我的代码使用由 c++ 插件生成的文件,但我正在尝试从头开始编写插件。 正如我添加到我的包中的文档中所解释的那
描述 我想用java调用golang grpc,我用老golang的consumer_proto.proto来生成java代码 过程 protoc --java_out=/home/xxx/src/
我正在开发一个应用程序,该应用程序必须针对使用 google protocol buffers 3.0.0 版的目标进行交叉编译。有没有办法在 protoc 命令(或 .proto 文件)中指定生成的
即使每个 python grpc 快速入门引用都使用 grpc_tools.protoc生成实现proto文件的python类,the closest thing to documentation t
我是一名优秀的程序员,十分优秀!