在使用sysroot进行交叉编译时,从arm-linux-gnueabihf-g ++中删除搜索路径

时间:2017-07-14 08:20:44

标签: gcc cross-compiling

我想为arm beaglebone交叉编译我的c ++程序。编译和链接工作,但二进制文件链接到错误的libstdc ++版本,执行失败

/usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `GLIBCXX_3.4.21' not found

在我的主人身上,我有:

strings /usr/lib/gcc-cross/arm-linux-gnueabihf/5/libstdc++.so | grep GLIBCXX_3
...
GLIBCXX_3.4.20
GLIBCXX_3.4.21

beaglebone的图像安装在〜/ bbsysroot:

strings ~/bbsysroot/usr/lib/arm-linux-gnueabihf/libstdc++.so.6 | grep GLIBCXX_3
...
GLIBCXX_3.4.20

所以,显然,版本不匹配。该版本不匹配很难避免,因为主机系统是不同的分发。

编译命令以

开头
/usr/bin/arm-linux-gnueabihf-g++ -mfloat-abi=hard --sysroot=/home/user/bbsysroot

所以我正在向编译器提供beaglebone的sysroot。我希望它在那里寻找libs并且只在那里寻找。但

/usr/bin/arm-linux-gnueabihf-g++ --sysroot=/home/user/bbsysroot -print-search-dirs | grep libraries | sed 's/:/\n/g'
libraries
 =/usr/lib/gcc-cross/arm-linux-gnueabihf/5/
/usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/lib/arm-linux-gnueabihf/5/
/usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/lib/arm-linux-gnueabihf/
/usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/lib/../lib/
/home/user/bbsysroot/lib/arm-linux-gnueabihf/5/
/home/user/bbsysroot/lib/arm-linux-gnueabihf/
/home/user/bbsysroot/lib/../lib/
/home/user/bbsysroot/usr/lib/arm-linux-gnueabihf/5/
/home/user/bbsysroot/usr/lib/arm-linux-gnueabihf/
/home/user/bbsysroot/usr/lib/../lib/
/usr/lib/gcc-cross/arm-linux-gnueabihf/5/../../../../arm-linux-gnueabihf/lib/
/home/user/bbsysroot/lib/
/home/user/bbsysroot/usr/lib/

显示,它也可以在主机上查找。我认为,主机库具有更高的优先级,因此采用了错误的版本。

是否可以强制交叉编译器仅使用sysroot中的库?或者出于某种原因完全错了?

1 个答案:

答案 0 :(得分:0)

我得到了一个答案,这可能会解决问题,但我已经转移到另一个项目,因为无法测试它。虽然它可能对其他人有所帮助:

libstdc ++和libgcc实际上是编译器的一部分,我想 最好的解决方案是:

  • 使用BBB系统(或更早版本)使用的编译器版本
  • 在BBB系统上升级这些库
  • 使用'-static-libstdc ++'选项

你可以尝试使用旧的libgcc和libstdc ++的never编译器, 但我认为gcc可能会引用一些较新的功能。克++ 还默认动态链接libgcc。