【问题标题】:Executing cross-compiled C++ program using Boost on Raspberry Pi在 Raspberry Pi 上使用 Boost 执行交叉编译的 C++ 程序
【发布时间】:2026-02-15 07:25:06
【问题描述】:

我已经为 RPi 构建了一个 GCC 交叉工具链,可以交叉编译 C++ 源代码并在将可执行文件复制到 RPi 后成功运行。

接下来,我使用交叉工具链构建了面向 ARM 的 Boost 库。我可以在我的 PC 上使用交叉工具链成功构建 C++ 源并将其链接到那些 Boost 库。

然后我将动态链接到 Boost 的程序复制到 RPi,并将所有内置库复制到 Pi 上的 /usr/local/lib。但是,执行失败:

$ ./my_program
./my_program: error while loading shared libraries: libboost_system.so.1.60.0: cannot open shared object file: No such file or directory

同样,这个库libboost_system.so.1.60.0 存在于/usr/local/lib 中。 我也试过了

export LD_LIBRARY_PATH='/usr/local/lib'

但这并没有改变任何东西。我做错了什么?

编辑:

我像这样构建所有源文件(rpi-g++ 是我的交叉编译器的符号链接):

rpi-g++ -c -std=c++1y -Wall -Wextra -pedantic -O2 -I /path/to/cross/boost/include *.cpp
rpi-g++ -o myprog *.o -L /path/to/cross/boost/lib/ -lboost_system -pthread

编辑 2:

链接时

rpi-g++ -o myprog *.o -L /path/to/cross/boost/lib/ -rdynamic -lboost_system -pthread

问题依旧。我也检查并验证了 Technaton 建议的所有内容。奇怪的是,ldd 坚持创建的可执行文件是not a dynamic executable”(在我的 PC 和 RPi 上检查过),这对我来说没有意义。

【问题讨论】:

    标签: c++ boost raspberry-pi cross-compiling


    【解决方案1】:

    您可以检查几项内容。我在这里发布了一个完整的检查清单,但从你的链接器命令行来看,数字 5 可能是罪魁祸首。

    1. 检查您的库和程序是否针对目标体系结构正确构建。您可以使用file ./myprogfile libboost_system.so.1.60.0 进行验证。
    2. 确保您复制了实际的共享对象,而不是指向它的链接。
    3. 确保共享对象文件的权限正常 (0755)。
    4. 运行ldconfig -v 并检查您的共享对象文件是否被拾取。通常/usr/local/lib在标准库搜索路径中,LD_LIBRARY_PATH不是必需的。
    5. 通过运行ldd ./myprog 确保您的程序实际上是动态链接的。从您的链接器命令行来看,这就是问题所在:您缺少-rdynamic
    6. 检查ldd返回的路径:如果你已经链接了rpath,库搜索路径可能搞砸了。不使用-rpath 重试。

    【讨论】:

    • ldconfig 肯定会选择它,我在输出中看到它。 exec 位已设置,我使用chownchgrp 确保用户可以访问它。可悲的是,它没有改变任何东西。同样的错误。
    • file libboost_system.so.1.60.0 的输出是什么?
    • libboost_system.so.1.60.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, not stripped。我已经检查过了,并认为它是正确的,但我可能是错的。它被“安装”到我的主文件夹的子目录中(在我的 PC 上),我在交叉构建时使用 -L 将链接器定向到那里。
    • 是的,如果库不匹配,链接器会退出,从架构角度来说。如果您运行ldd ./myprog,无论是否设置LD_LIBRARY_PATH,会发生什么? (/usr/local/lib 通常不要求您导出 LD_LIBRARY_PATH,但永远无法确定...)此外,检查您的程序是否与 rpath 选项链接,这可能会导致 Pi 上的 Linux 查找共享对象文件在错误的位置。 ldd 的输出应该很明显。
    • 请在构建 myprog 时发布您的链接器命令行(最好添加到您的问题中)。