我正在尝试在我的 IDF 项目中使用一些C++原型缓冲区文件,但我在让它工作时遇到了一些问题。我已经在我的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(使用此处的默认设置和说明)安装/usr/local。
- Protobufs 需要 pthread 库,因此需要 -lpthread 标志。
- 使失败,出现错误"不能将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
...
我使用以下命令像正常一样编译 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,它根据需要使用来自myfile.proto的Protobuf消息使用它们的c类,但通过仅c-feature的c ++(只是内部与类交互的公共函数)将功能公开给main。也许不是最简单的方法,但它正在工作!
您无法将ESP32 应用与针对构建架构编译的库链接(除非您在 ESP32 机器上编译,这不太可能)。 您还必须为 ESP32 编译 protobuf 库。 您不应该在 ESP32 程序中使用/usr/local/{include,lib} 中的任何内容。
您需要将 protobuf 构建系统构建到 ESP IDF 系统中[*]。 您将有要交叉编译的 protobuf 库文件和要交叉编译的生成的 myfile.pb.cc 文件。
*:我没有这样做,所以这是一个留给读者的练习。