如何将gcc约束到某个运行环境

问题描述 投票:0回答:1

我们有一个构建大量项目的 CI 管道。其中一个项目使用高级 C++ 功能 (C++20),因此我们已将 gcc 版本升级到 gcc-9。

但是,我们有一些运行 debian buster 的目标嵌入式系统,并且没有更高版本的 libc。为 Buster 映像构建的映像不依赖于 C++20,其 Makefile 专门指定了 std=c++17。

所有这些项目以前都运行良好,但是现在我们遇到了这样的错误:

./project: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by ./project)
./project: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by ./project)
./project: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./project)

当我研究这些符号时,我发现 g++ “不必要”链接到新版本的东西,而这些东西实际上不应该(据我所知)需要更新版本:

objdump -T project | egrep "GLIBC_2.3[2-6]"
00000000      DF *UND*  00000000  GLIBC_2.33  lstat
00000000      DF *UND*  00000000  GLIBC_2.34  pthread_once
00000000      DF *UND*  00000000  GLIBC_2.36  arc4random
00000000      DF *UND*  00000000  GLIBC_2.34  pthread_detach
00000000      DF *UND*  00000000  GLIBC_2.34  pthread_join
00000000      DF *UND*  00000000  GLIBC_2.34  pthread_setspecific
00000000  w   DF *UND*  00000000  GLIBC_2.34  __pthread_key_create
00000000      DF *UND*  00000000  GLIBC_2.33  fstat64
00000000      DO *UND*  00000000  GLIBC_2.32  __libc_single_threaded
00000000      DF *UND*  00000000  GLIBC_2.34  pthread_key_create
00000000      DF *UND*  00000000  GLIBC_2.34  pthread_key_delete
00000000      DF *UND*  00000000  GLIBC_2.34  pthread_getspecific
00000000      DF *UND*  00000000  GLIBC_2.34  pthread_create
00000000      DF *UND*  00000000  GLIBC_2.34  __libc_start_main

当然,我不需要在我的边缘设备上进行buster->bookworm升级,这样我就可以获得一个新的和改进的bad_array_ thrower?!

有没有办法通知 gcc 不要轻率地使用较新的符号,除非它们实现新功能?

再次强调:正在构建的项目不使用 c++20,它们在 gcc-8 上编译和运行良好。只是新的工具链使其无法在现场设备中构建。


编辑: 很清楚:我完全理解工具链不能混合搭配。我只是希望能够在 buster 系统上使用 C++20 功能,而无需将其升级到 bullseye+(因为 gcc-8 是 buster 上可用的最高软件包)。

c++ gcc g++ libc
1个回答
0
投票

TL;DR:与 GLIBC 不同,在任何操作系统上使用较新版本的

libsdtdc++.so.6
都很简单,并且 Buster 不会阻止您使用
libstdc++.so.6
版本 2.36。

所以您要确认的是:gcc 不允许在 buster 上使用任何新的 C++20 功能 - 没有两种方法。

这完全不正确:您可以在 Buster 上使用 gcc-10 编译的二进制文件,但您

必须
为此类二进制文件提供适当的 libstdc++ 版本。
与 GLIBC 不同,将二进制文件指向备用 

libstdc++.so.6

琐碎
——只需在目标系统上的某个位置复制工具链的 libstdc++.so.6,然后设置
-rpath
,以便二进制文件在运行时使用备用
libstdc++.so.6
.
确实 

libstdc++.so.6

版本 2.36

可能
具有足够的向后兼容性,您可以用更新的版本替换系统版本 (/usr/lib/arm-linux-gnueabihf/libstdc++.so.6),并且一切将继续工作。
    

© www.soinside.com 2019 - 2024. All rights reserved.