protocol-buffers - 将 Google Protobuffers(C++) 与 ESP-IDF 结合使用

标签 protocol-buffers esp32 esp-idf

我正在尝试在我的 IDF 项目中使用一些 C++ protobuffer 文件,但在使其正常工作时遇到一些问题。我已经在 test.proto 文件上使用 protoc 生成了 test.pb.cc 和 test.pb.h 文件。当我尝试运行“make”时,编译 test.pb.cc 失败,并显示以下错误消息:

In file included from /Users/ethan/Documents/Development/project/components/component/test/test/test.cpp:2:0:
/Users/ethan/Documents/Development/project/components/component/test/test/test.pb.h:10:40: fatal error: google/protobuf/port_def.inc: No such file or directory

我猜这是我的 component.mk 文件的问题?我不知道如何在 component.mk 中链接 Protobuf 库。我在我编写的一个快速命令行程序中得到了这个工作,并且 makefile 在 LDFLAGS 中使用了 -L ~/usr/local/lib ,在 g++ 命令中使用了 -lprotobuf 。有什么想法吗?

我也在 esp32.com 上提出了这个问题,试图吸引更广泛的受众,因为我真的必须尽快让这个工作发挥作用。预先感谢您的帮助!

最佳答案

编辑(4/30/19):这最终并没有完全解决问题,因为我无法完全编译我的代码,但它确实修复了包含错误,所以也许我有点正确的轨道。任何帮助仍然值得赞赏!我现在收到错误“function_from_protobuf_name 未定义...”的链接错误。现在可能会收到数百行这些错误。

看来我现在已经可以使用了。在我的项目/主目录中,我将以下行添加到我的 component.mk 文件中:

CXXFLAGS += -lpthread -DGOOGLE_PROTOBUF_NO_RTTI -I/usr/local/include

我已将 Protobuf (使用默认设置和说明 here )安装到/usr/local。

  • Protobufs 需要 pthread 库,因此需要 -lpthread 标志。
  • Make 失败,出现错误“无法将 typeid 与 -fno-rtti 一起使用”,该错误已通过添加 -DGOOGLE_PROTOBUF_NO_RTTI 修复
  • -I/usr/local/include 将 usr/local/include(安装 Protobuf 的位置)添加到编译器搜索的路径列表中

我的项目结构如下:

-project
    -main
        -pb
            myfile.proto
            myfile.pb.cc
            myfile.pb.h
            myfile_c_interface.h
            myfile_c_interface.cpp
        -main.c
        -component.mk (this is the one I added the above line to)
    -Makefile
    -partitions.csv
    ...

我使用以下命令像平常一样使用 protoc 编译了 myfile.proto:

cd main/pb
protoc --cpp_out=. myfile.proto

生成 myfile.pb.cc 和 myfile.pb.h

为了与我的 main.c 接口(interface),我编写了 myfile_c_interface.h 和 myfile_c_interface.cpp,它们根据需要使用它们的 c 类使用来自 myfile.proto 的 Protobuf 消息,但通过仅 c 功能的 c++ 向 main 公开功能(只是与内部类交互的公共(public)函数)。也许不是最简单的方法,但它有效!

关于protocol-buffers - 将 Google Protobuffers(C++) 与 ESP-IDF 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55694311/

相关文章:

protocol-buffers - Protobuf3 : How to describe map of repeated string?

c++ - 将数据流式传输到 protobuf 解析器 C++

java - 关于 Google Protocol Buffer 的查询

c - ESP-IDF 框架中的链接器错误(未定义引用)

java - Gradle 无法检测到 osdetector 插件

ios - 如何从 ios 应用程序通过 BLE 打开连接到 arduino 的 LED?

arduino - ESP32 上的 GPS 模块未提供有效日志

node.js - 任务计划管理

c - 通过 uart 的 esp32 printf channel (esp-idf)