Использование Google Protobuffers(C++) с ESP-IDF
Я пытаюсь использовать некоторые файлы протобуфера C++ с моим проектом IDF, но у меня возникают некоторые проблемы с его работой. Я сгенерировал свои файлы test.pb.cc и test.pb.h с помощью protoc в моем файле test.proto. Когда я пытаюсь запустить "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? Я не уверен, как идти о связывании библиотеки Protobuf в component.mk. Я получил это, работая в быстрой программе командной строки, которую я написал, и make-файл для этого использовал -L ~/usr/local/lib в LDFLAGS и -lprotobuf в команде g++. Есть идеи?
Я также задавал этот вопрос на esp32.com, чтобы попытаться привлечь более широкую аудиторию, потому что мне действительно скоро это нужно. Заранее благодарю за любую помощь!
2 ответа
Вы не можете связать приложение ESP32 с библиотекой, скомпилированной для вашей архитектуры сборки (если только вы не компилируете на машине ESP32, что весьма маловероятно). Вам также придется скомпилировать библиотеки protobuf для ESP32. Вы не должны использовать НИЧЕГО из /usr/local/{include,lib} в своих программах ESP32.
Вам нужно будет структурировать систему сборки protobuf в систему ESP IDF [*]. У вас будут файлы библиотеки protobuf для кросс-компиляции и созданные файлы myfile.pb.cc для кросс-компиляции.
*: Я этого не делал, так что это упражнение осталось для читателя.
РЕДАКТИРОВАТЬ (30/04/19): Это не привело к полному устранению проблемы, так как я не смог полностью скомпилировать свой код, но он исправил ошибки включения, так что, возможно, я на правильном пути, Любая помощь по-прежнему ценится! Теперь я получаю ссылки на ошибки с ошибками "function_from_protobuf_name is undefined...". Получая, вероятно, сотни строк этих ошибок сейчас.
Похоже, я получил это работает сейчас. В моем каталоге project / main я добавил следующую строку в мой файл 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 как обычно с protoc, используя команды:
cd main/pb
protoc --cpp_out=. myfile.proto
производить myfile.pb.cc и myfile.pb.h
Для взаимодействия с моим main.c я написал myfile_c_interface.h и myfile_c_interface.cpp, который использует сообщения Protobuf из myfile.proto по мере необходимости, используя их классы c, но предоставляет функциональность main через c-feature-only C++ (только публичные функции). которые взаимодействуют с классами внутри страны). Может быть, не самый простой способ, но это работает!