c++ - 在 Raspberry Pi 上使用 Boost 执行交叉编译的 C++ 程序

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

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

接下来,我使用交叉工具链构建了针对 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++ 是我的交叉编译器的符号链接(symbolic link)):

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 坚持创建的可执行文件是不是动态可执行文件”(已在我的 PC 和 RPi 上进行了检查),这并不对我来说很有意义。

最佳答案

您可以检查几项内容。我已在此处发布了完整的检查列表,但从您的链接器命令行来看,数字 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 的情况下重试。

关于c++ - 在 Raspberry Pi 上使用 Boost 执行交叉编译的 C++ 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34885432/

相关文章:

c++ - Cpp 错误,在 Visual Studio 2012 中包含多个文件

c++ - 无法从 Windows 注册表中读取字符串

c++ - 多态性 c++,当对一个对象进行更改时,所有对象都会更改

linux - Raspberry Pi 临时网络

c++ - 在不使用 #include 的情况下使用另一个类中的函数

c++ - 使用 std::set 替代 BOOST_FOREACH?

c++ - 基于基类的特殊成员函数

c++ - 如何在 Linux 上使用 Boost Wave Lib

raspberry-pi - 树莓派以太网未连接

使用 hostapd 创建访问点后 SSH 进入 linux