- 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/
我尝试在安装了多类型 MFC 库的 visual studio 2015 MFC 上运行以前编写的 MFC c++ 代码。 但是,我这里仍然有 12 个关于缺少函数的错误: IntelliSense:
我正在学习 OOP 并且有疑问。假设我有一个包含 ClassB.h 的文件 ClassA.h,并且在某些时候我的 ClassB.h 需要包含 ClassA .h。 这会产生一个错误,我想我明白为什么会
我开始使用 CUDA 进行编程,在一些示例中我找到了包含文件 cuda.h、cuda_runtime.h 和 cuda_runtime_api.h 包含在代码中。有人可以向我解释一下这些文件之间的区别
我有一些生成正则表达式的代码。那么下面的表达式实际上是: ^(?:\s*((exclude|include|hide|show|protect|risk|dir-merge|merge)),\s*((
我一直在查看一些源代码,以更好地了解我们使用的这款游戏的核心,并编写更可靠、更快速的插件。然后我发现了这段奇怪的代码...... public void setMaxH(double amount)
通常我们会使用标准类型作为 std::unordered_map 的键和值.但现在我需要自定义我自己的键和值类。 键类在block_cache_key.h 中定义如下: #ifndef BLOCK_C
例如,我想要两个头文件,它们可以依赖于另一个头文件中的函数。 //Header1.h file #include Header2.h void h1(){ //... func1(); } v
我正在研究来自 Sedgewick 的 Shell 排序 Algorithms in C part 1-4在第 172 页。 我使用 size (数组的长度),而不是 l和 r (开始和结束);所以我
我在 macOS BigSur 上通过 VMWare 使用 Ubuntu 20.04.2 LTS。我安装了最新版本的 tcl、tcl-dev、tk 和 tk-dev - 版本 8.6。我想编译 Arc
我用我的 glu 和 gl 头文件构建了一个 OpenGL 程序,默认包含在 windows 7 专业版中。现在,我买了一本描述 OpenGL 游戏开发的书。这本书的作者说,我必须在我的项目中包含 g
我想在 token 中保留特殊字符,同时仍对特殊字符进行 token 化。说我有话 "H&R Blocks" 我想将其标记为 "H", "R", "H&R", "Blocks" 我读了http://w
关于 hash 作为 trans 参数的另一个问题。在下面的代码中,简单地使用 hash 会给出不正确的结果,但是将其替换为 keys 和 values 会使其正确。怎么了? my @alph1 =
我已经编写了一个 C 程序,它获取屏幕像素的 RGB 值 (0-255),并知道其位置 (x,y)。它可以在 Linux 中运行,但是当我尝试在 Visual Studio (Windows) 中编译
我已经使用 Windows 7 专业版中默认包含的 glu 和 gl 头文件构建了一个 OpenGL 程序。现在,我买了一本描述 OpenGL 游戏开发的书。这本书的作者说,我必须将glew head
#include using namespace std; #include //#include int main() { initscr();
h:messages h:form 内的组件还显示与外部组件相关的消息。 如何限制它只显示与包含 h:form 内的组件相关的消息? 我不喜欢用单独的h:message来使我的代码膨胀。每个输入组件的
我下载了示例代码和 cpp 文件,其中包含 list.h、queue.h 和 vector.h 等头文件,如果我尝试构建,我会收到“ fatal error :没有这样的文件或目录编译终止”我想我应该
我有一个编译成功的桌面项目,但是在我向项目添加新配置以支持 Windows Mobile 平台后,我收到以下错误: error C2146: syntax error : missing ';' be
有很多关于这个错误的帖子,但我无法解决它,我希望你能拿出解决方案。我在 Ubuntu 机器上。 ~/graphmap2$ 在这个文件夹中,我下载了 zlib。可以看图 经过一番谷歌搜索后,我还注意到没
是否可以在 Visual C++ 中使用以下 header : 图.h dos.h bios.h 最佳答案 据我所知,无法在 Visual C++ 中使用它, 与此同时,我希望您关注 Open Wat
我是一名优秀的程序员,十分优秀!