我想为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中的库?或者出于某种原因完全错了?
答案 0 :(得分:0)
我得到了一个答案,这可能会解决问题,但我已经转移到另一个项目,因为无法测试它。虽然它可能对其他人有所帮助:
libstdc ++和libgcc实际上是编译器的一部分,我想 最好的解决方案是:
你可以尝试使用旧的libgcc和libstdc ++的never编译器, 但我认为gcc可能会引用一些较新的功能。克++ 还默认动态链接libgcc。