簡體   English   中英

與 Qt 交叉編譯到 Raspberry Pi 3B+ 地址簿(協議緩沖區) - 錯誤符號查找錯誤

[英]Cross-compile with Qt to Raspberry Pi 3B+ the addressbook (Protocol Buffer) - error symbol lookup error

我正在從 Qt(Ubuntu 19.10 - 5.12.3 )交叉編譯到 Raspberry Pi 3B+( stetch )。 我已經成功了,我可以運行從 Qt 到 Raspberry 的應用程序。

現在我想使用通過 protoc(協議緩沖區)獲得的 .h 和 .cc 文件部署和執行應用程序。

所以首先我在我的筆記本電腦中安裝了協議緩沖區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

程序構建和部署但是....當我按運行時出現此錯誤

/home/pi/untitled/bin/untitled:符號查找錯誤:/home/pi/untitled/bin/untitled:未定義符號:_ZN6google8protobuf8internal26fixed_address_empty_stringE

我該如何解決?

在樹莓里面我試過: ldd -d -r untitled

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)

嘗試將此添加到 your.pro 文件中。

DEFINES += PROTOBUF_USE_DLLS

實際上,您正在鏈接到動態構建的 PB 庫。 因此,您需要添加此預處理器定義。 如果可以選擇,您也可以靜態構建 PB。

您可能還需要注意這一點

交叉編譯注意事項

makefile 通常會調用他們剛剛構建的 protoc 可執行文件來構建測試。 交叉編譯時,protoc 可執行文件可能無法在主機上執行。 在這種情況下,您必須首先為主機構建 protoc 的副本,然后使用 --with-protoc 選項告訴 configure 使用它。 例如:

./configure --with-protoc=protoc

這將使用已安裝的協議(在您的 $PATH 中找到),而不是嘗試執行在構建過程中構建的協議。 您還可以使用尚未安裝的可執行文件。 例如,如果您在../host 中為您的主機構建了 protobuf package,您可能會這樣做:

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

無論哪種方式,您都必須確保您使用的 protoc 可執行文件與您嘗試使用它的 protobuf 源代碼具有相同的版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM