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

时间:2016-01-19 19:32:23

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

我为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" (检查在我的电脑和RPi上),这对我没有意义。

1 个答案:

答案 0 :(得分:4)

您可以查看几件事。我在这里发布了一个完整的检查清单,但是从您的链接器命令行判断, number 5 可能是罪魁祸首。

  1. 检查您的库和程序是否针对目标体系结构正确构建。您可以使用file ./myprogfile libboost_system.so.1.60.0
  2. 来验证这一点
  3. 确保您已复制实际的共享对象,而不是指向它的链接。
  4. 确保共享对象文件的权限是正确的(0755)。
  5. 运行ldconfig -v并检查您的共享对象文件是否已被选中。通常,/usr/local/lib位于标准库搜索路径中,并且不需要LD_LIBRARY_PATH
  6. 通过运行ldd ./myprog确保您的程序实际上是动态关联的。从您的链接器命令行判断,问题是:您缺少-rdynamic
  7. 检查从ldd返回的路径:如果已与rpath链接,则库搜索路径可能会被搞砸。请在没有-rpath的情况下重试。