将Google Protobuffers(C ++)与ESP-IDF一起使用

时间:2019-04-15 17:17:40

标签: protocol-buffers esp32 esp-idf

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

let text = "The date is 12 foobar, 2019."

我猜这是我的component.mk文件的问题吗?我不确定如何在component.mk中链接Protobuf库。我在编写的快速命令行程序中使用了该文件,在LDFLAGS中使用了-L〜/ usr / local / lib并在g ++命令中使用了-lprotobuf来创建该文件。有什么想法吗?

我也曾在esp32.com上问过这个问题,试图扩大受众范围,因为我真的必须尽快使它生效。预先感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

EDIT(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标志。
  • 通过添加“ -DGOOGLE_PROTOBUF_NO_RTTI”已修复的错误“无法与-fno-rtti一起使用typeid”失败了
  • -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进行接口,我编写了myfile_c_interface.h和myfile_c_interface.cpp,它们使用其c类根据需要使用来自myfile.proto的Protobuf消息,但通过仅具有c功能的c ++向main公开了功能(只是在内部与类交互的公共函数)。也许不是最简单的方法,但是它正在工作!

答案 1 :(得分:0)

您不能将ESP32应用程序链接到针对您的构建体系结构编译的库(除非您在ESP32机器上进行编译,这极不可能)。您还必须为ESP32编译protobuf库。您不应在ESP32程序中使用/ usr / local / {include,lib}中的任何内容。

您需要将protobuf构建系统构建为ESP IDF系统[*]。您将需要protobuf库文件进行交叉编译,并将生成的myfile.pb.cc文件进行交叉编译。

*:我还没有这样做,所以这是留给读者的练习。