Использование 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++ (только публичные функции). которые взаимодействуют с классами внутри страны). Может быть, не самый простой способ, но это работает!

Другие вопросы по тегам