与Qt交叉编译到Raspberry Pi 3B +地址簿(协议缓冲区)-错误符号查找错误

问题描述 投票:0回答:1

i从Qt(5.12.3)交叉编译到Raspberry Pi 3B +(stetch)。我已经成功做到了,我能够运行从Qt到Raspberry的应用程序。

现在,我要使用通过协议(协议缓冲区)获得的.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无标题

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)
c++ qt raspberry-pi protocol-buffers
1个回答
0
投票

尝试将此添加到您的.pro文件中。

DEFINES += PROTOBUF_USE_DLLS

实际上,您正在链接到动态构建的PB库。因此,您需要添加此预处理程序定义。如果可以的话,您也可以静态构建PB。

您可能还想记下this

交叉编译注意

makefile通常会调用它们刚刚生成的protoc可执行文件建立以建立测试。交叉编译时,协议可执行文件在主机上可能不是可执行文件。在这种情况下,您必须先为主机构建protoc副本,然后使用--with-protoc选项告诉configure改用它。对于例如:

./ configure --with-protoc = protoc这将使用已安装的协议(在您的$ PATH中找到),而不是尝试执行已构建的在构建过程中。您还可以使用没有已安装。例如,如果您为以下目的构建了protobuf软件包您的主机在../host中,您可以这样做:

../ configure --with-protoc = .. / host / src / protoc无论哪种方式,您都必须确保您使用的protoc可执行文件的版本与您正在尝试使用它的protobuf源代码。

© www.soinside.com 2019 - 2024. All rights reserved.