Использование Google Protobuffers (C ++) с ESP-IDF - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь использовать некоторые файлы протобуфера 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 ]

0 голосов
/ 01 мая 2019

Вы не можете связать приложение ESP32 с библиотекой, скомпилированной для вашей архитектуры сборки (если только вы не компилируете на машине ESP32, что весьма маловероятно).Вам также придется скомпилировать библиотеки protobuf для ESP32.Вы не должны использовать НИЧЕГО из / usr / local / {include, lib} в своих программах ESP32.

Вам потребуется структурировать систему сборки protobuf в систему ESP IDF [*].У вас будут файлы библиотеки protobuf для кросс-компиляции и сгенерированные файлы myfile.pb.cc для кросс-компиляции.

*: я этого не делал, так что это упражнение осталось для читателя.

0 голосов
/ 20 апреля 2019

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

...