Кросс-компиляция с Qt в Raspberry Pi 3B + адресная книга (Protocol Buffer) - ошибка поиска символа - PullRequest
1 голос
/ 03 ноября 2019

Я кросс-компилирую из Qt (Ubuntu 19.10 - 5.12.3 ) в Raspberry Pi 3B + ( stetch ). Мне удалось это сделать, я могу запустить приложение из Qt в Raspberry.

Теперь я хочу развернуть и запустить приложение с файлами .h и .cc, полученными по протоколу protoc (протоколбуфер).

Итак, сначала я установил буфер протокола 3.10.1 на своем ноутбуке ... я создал файлы .h и .cc, а затем в Qt добавил их в свой проект ( untitled.pro ).

После того, как я повторил операцию с этой конфигурацией:

./configure --host=arm-linux CC=/home/belfix/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc CXX=/home/belfix/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++

Таким образом, я получил libprotobuf.a, необходимый длямалина ... В Qt untitled.pro я добавил следующие строки:

unix:!macx: LIBS += -L$$PWD/../../../usr/local/lib/ -lprotobuf

INCLUDEPATH += $$PWD/../../../usr/local/include
DEPENDPATH += $$PWD/../../../usr/local/include

unix:!macx: PRE_TARGETDEPS += $$PWD/../../../usr/local/lib/libprotobuf.a

Сборка и развертывание программы, но .... У меня появляется эта ошибка, когда я нажимаю Run

/ home / pi / без названия / bin / без названия: ошибка поиска символа: / home / pi / без названия / bin / без названия: неопределенный символ: _ZN6google8protobuf8internal26fixed_address_empty_stringE

Как я могу это исправить?

Внутри малины я попробовал: ldd -d -r без названия

linux-vdso.so.1 (0x7ef7d000)
/usr/lib/arm-linux-gnueabihf/libarmmem.so (0x76ee8000)
libprotobuf.so.21 => /usr/local/lib/libprotobuf.so.21 (0x76c9d000)
libQt5Widgets.so.5 => /usr/local/qt5pi/lib/libQt5Widgets.so.5 (0x76770000)
libQt5Gui.so.5 => /usr/local/qt5pi/lib/libQt5Gui.so.5 (0x762b8000)
libQt5Mqtt.so.5 => /usr/local/qt5pi/lib/libQt5Mqtt.so.5 (0x76288000)
libQt5Network.so.5 => /usr/local/qt5pi/lib/libQt5Network.so.5 (0x7610b000)
libQt5Core.so.5 => /usr/local/qt5pi/lib/libQt5Core.so.5 (0x75ba1000)
libGLESv2.so.2 => /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 (0x75b7c000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x75b53000)
libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0x75a0b000)
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0x7598c000)
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0x7595f000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x75820000)
libz.so.1 => /lib/arm-linux-gnueabihf/libz.so.1 (0x757f9000)
/lib/ld-linux-armhf.so.3 (0x76efe000)
libpng16.so.16 => /usr/lib/arm-linux-gnueabihf/libpng16.so.16 (0x757bf000)
libdouble-conversion.so.1 => /usr/lib/arm-linux-gnueabihf/libdouble-conversion.so.1 (0x7579d000)
libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0x7578a000)
libgthread-2.0.so.0 => /usr/lib/arm-linux-gnueabihf/libgthread-2.0.so.0 (0x75778000)
libglib-2.0.so.0 => /lib/arm-linux-gnueabihf/libglib-2.0.so.0 (0x75670000)
libbrcmEGL.so => /opt/vc/lib/libbrcmEGL.so (0x75637000)
libbcm_host.so => /opt/vc/lib/libbcm_host.so (0x7560e000)
libvchiq_arm.so => /opt/vc/lib/libvchiq_arm.so (0x755f8000)
libvcos.so => /opt/vc/lib/libvcos.so (0x755df000)
librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0x755c8000)
libpcre.so.3 => /lib/arm-linux-gnueabihf/libpcre.so.3 (0x7554f000)
undefined symbol: _ZN6google8protobuf8internal26fixed_address_empty_stringE (./untitled)
undefined symbol: _ZNK6google8protobuf7Message25InitializationErrorStringEv (./untitled)
undefined symbol: _ZNK6google8protobuf7Message11GetTypeNameEv   (./untitled)
undefined symbol: _ZN6google8protobuf8internal24InlineGreedyStringParserEPSsPKcPNS1_12ParseContextE (./untitled)
undefined symbol: _ZN6google8protobuf2io19EpsCopyOutputStream30WriteStringMaybeAliasedOutlineEjRKSsPh   (./untitled)

1 Ответ

0 голосов
/ 03 ноября 2019

Попробуйте добавить это в ваш .pro-файл.

DEFINES += PROTOBUF_USE_DLLS

На самом деле вы ссылаетесь на динамически создаваемую библиотеку PB. Итак, вам нужно добавить это определение препроцессора. Вы также можете построить PB статически, если это возможно.

Вы также можете отметить this :

Примечание для кросс-компиляции

Обычно make-файлы вызывают исполняемый файл protoc, который они только что создали для построения тестов. При кросс-компиляции исполняемый файл protoc может не выполняться на хост-компьютере. В этом случае вы должны сначала создать копию protoc для хост-машины, а затем использовать опцию --with-protoc, чтобы настроить ее на использование. Например:

./configure --with-protoc=protoc

При этом будет использоваться установленный протокол (найденный в вашем $ PATH) вместо попытки выполнить тот, который был собран во время процесса сборки. Вы также можете использовать исполняемый файл, который не был установлен. Например, если вы собрали пакет protobuf для своего хост-компьютера в ../host, вы можете сделать:

./configure --with-protoc=../host/src/protoc

В любом случае, вы должны убедиться, что исполняемый файл protoc выuse имеет ту же версию, что и исходный код protobuf, с которым вы пытаетесь его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...