2

我正在尝试在我的 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 库。我在我编写的一个快速命令行程序中得到了这个工作,并且在 LDFLAGS 中使用了 -L ~/usr/local/lib,在 g++ 命令中使用了 -lprotobuf。有任何想法吗?

我也在 esp32.com 上问过这个问题,以尝试吸引更广泛的受众,因为我真的必须尽快完成这项工作。提前感谢您的帮助!

4

2 回答 2

1

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

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

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

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

  • Protobufs 需要 pthread 库,因此需要 -lpthread 标志。
  • Make 失败并出现错误“无法使用带有 -fno-rtti 的 typeid”,该错误已通过添加 -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 接口,我编写了 myfile_c_interface.h 和 myfile_c_interface.cpp,它们根据需要使用他们的 c 类使用来自 myfile.proto 的 Protobuf 消息,但通过仅 c 功能的 c++(只是公共函数)将功能公开给 main在内部与类交互)。也许不是最简单的方法,但它的工作原理!

于 2019-04-19T23:14:29.477 回答
1

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

您需要将 protobuf 构建系统构建到 ESP IDF 系统[*]中。您将拥有要交叉编译的 protobuf 库文件和要交叉编译的生成的 myfile.pb.cc 文件。

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

于 2019-05-01T20:58:39.307 回答