【问题标题】:Cross-compile with Qt to Raspberry Pi 3B+ the addressbook (Protocol Buffer) - error symbol lookup error使用 Qt 交叉编译到 Raspberry Pi 3B+ 地址簿(协议缓冲区) - 错误符号查找错误
【发布时间】:2019-11-03 12:14:54
【问题描述】:

我正在从 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

我该如何解决?

在我尝试过的 Raspberry 内部: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)

【问题讨论】:

    标签: c++ qt raspberry-pi protocol-buffers


    【解决方案1】:

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

    DEFINES += PROTOBUF_USE_DLLS
    

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

    您可能还想注意this

    交叉编译注意事项

    makefile 通常会调用它们刚刚生成的 protoc 可执行文件 为了构建测试而构建。交叉编译时,protoc 可执行文件可能无法在主机上执行。在这种情况下, 您必须先为主机构建 protoc 副本,然后使用 --with-protoc 选项告诉 configure 使用它。为了 示例:

    ./configure --with-protoc=protoc

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

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

    不管怎样,你必须 确保您使用的 protoc 可执行文件与 您尝试使用它的 protobuf 源代码。

    【讨论】:

    • 谢谢!我会尝试...环境是 Ubuntu 19.10 我尝试使用“交叉编译注释”...它不起作用:(
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    相关资源
    最近更新 更多