针对特定版本的 armhf g++ 进行编译

Posted

技术标签:

【中文标题】针对特定版本的 armhf g++ 进行编译【英文标题】:Compiling againts especific version of armhf g++ 【发布时间】:2016-10-11 19:22:08 【问题描述】:

我正在将 QT 应用程序从 Debian(Stretch)PC 交叉构建到 Debian(Jessie)BeagleBone Black,当我执行此操作时,我收到了消息

/home/bbuser/totemguard/totemguard: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `GLIBCXX_3.4.22' not found (required by /home/bbuser/totemguard/totemguard)

我看到 armhf g++ 版本是 6.1,所以我安装了 4.9.2-10(与我在 BeagleBone Black 上的相同)并重新编译了我的代码,结果相似(不同的 GLIBXX 版本):

/home/bbuser/totemguard/totemguard: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /home/bbuser/totemguard/totemguard)

阅读ABI Policy and Guidelines,GLIBCXX_3.4.21的G++版本是5.1.0:

GCC 4.9.0:GLIBCXX_3.4.20、CXXABI_1.3.8

GCC 5.1.0:GLIBCXX_3.4.21、CXXABI_1.3.9

GCC 6.1.0:GLIBCXX_3.4.22、CXXABI_1.3.10

但我的主机 PC 或 BeagleBone Black 板上从未安装过 5.1 版本。

列出 /usr/lib/arm-linux-gnueabihf/ 目录我们可以看到只有 GCC 4.9.0 和 GCC 6.1.0 libstdc++ 版本:

lrwxrwxrwx 1 root root      19 ago  3 15:53 libstdc++.so.6 -> libstdc++.so.6.0.22
-rw-r--r-- 1 root root  658064 dic 27  2014 libstdc++.so.6.0.20
-rw-r--r-- 1 root root 1019632 ago  3 15:53 libstdc++.so.6.0.22

这个问题是从jessie 升级到stretch 后出现的,我无法升级beaglebone black gcc 版本。

我能做什么?

编辑 1: 在测试板(BeagleBone Black)上,我添加了拉伸存储库并执行了以下操作:

bbuser@beaglebone:~/totemguard$ sudo apt-cache policy libstdc++6
libstdc++6:
    Installed: 4.9.2-10
    Candidate: 6.1.1-11
    Version table:
        6.1.1-11 0
            500 http://ftp.us.debian.org/debian/ stretch/main armhf Packages
    *** 4.9.2-10 0
    500 http://ftp.us.debian.org/debian/ jessie/main armhf Packages
    100 /var/lib/dpkg/status
bbuser@beaglebone:~/totemguard$ sudo apt-get install libstdc++6
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
    gcc-6-base
The following NEW packages will be installed:
    gcc-6-base
The following packages will be upgraded:
    libstdc++6
1 upgraded, 1 newly installed, 0 to remove and 726 not upgraded.
Need to get 517 kB of archives.
...

并且应用程序运行良好(未 100% 测试,但没有出现错误)。这仍然是一块测试板,我不能在生产板上做同样的事情。

【问题讨论】:

【参考方案1】:

解决方案 1) 使用 -static(完整库)或仅编译 libstdc++ 作为二进制文件的静态

解决方案 2) 将适当的 libstdc++ 版本与二进制文件一起分发(可能使用 LD_PRELOAD)

解决方案3)使用完全相同的g++ libstdc++版本进行交叉编译(至少匹配)

通常更好的是使用解决方案 1) - 跨发行版升级不会有任何问题

【讨论】:

我尝试了“解决方案 3”,匹配 g++ 和 gcc 版本(这是 libstdc++ 3.4.20 附带的,但它仍然链接到 3.4.21。这是我的问题。我会尝试解决方案几天后 1 个。谢谢。 这是因为新库仍然存在于交叉编译环境中。您可以在编译时删除它或隐式传递特定的:gcc my_prog.cpp /usr/lib/libstdc++.so.6.xx.x -lother_libraries

以上是关于针对特定版本的 armhf g++ 进行编译的主要内容,如果未能解决你的问题,请参考以下文章

使用 qmake 查找编译器供应商/版本

编译TensorFlow CPU指令集优化版

针对多个版本的 .net 框架

如何针对特定机型,编译cwm recovery

如何在 c++ Autotools 项目中使用不同版本的 g++ 进行编译

无法在 GCC 8.3.1 中使用 TSDuck 进行编译