如何建立用于交叉编译的C++工具链



我有一个目标系统Astra Linux Smolensk,它可以访问非常过时的包,其中包括GCC 6。它不支持C++17,这是一些非常有用的第三方库和语言功能所必需的。在某种程度上,我正在考虑使用20标准中的概念的可能性。但实现这一点并非易事
基本上,我看到两种方式:

  1. 自己编译需要的GCC版本,并拥有一个自定义版本的Astra Linux,用于使用额外的包进行构建(这不是一个好的选择,因为我们对系统修改有限制(。我即将尝试这个选项,但它不是这个问题的主题
  2. 使用工具链在Ubuntu上与最新的GCC进行交叉编译

那么,我需要什么才能为自定义版本的Linux创建工具链?我唯一确定的是Linux核心版本。我可以使用现有的Linux工具链吗?还是必须导出系统库并创建自定义工具链?


在这里我发现了一些似乎很有用的工具。例如:

Buildroot
Buildroot是一个基于Linux内核配置系统的完整构建系统,支持多种目标体系结构。它生成根文件系统映像,准备写入闪存。除了有大量可以编译到映像中的包外,它还生成了一个跨工具链来从源代码构建这些包。即使您不想将buildroot用于根文件系统,它也是生成工具链的有用工具。Buildroot支持uClibc ng、glibc和musl。

我想知道它是否满足了我的需求,我可以将最新的GCC编译器与那些生成的工具链一起使用吗。


我发现了类似的问题:
如何使用旧的stdlib和libc在旧的linux发行版中构建C++17应用程序
https://askubuntu.com/questions/162465/are-gcc-versions-tied-to-kernel-versions
如何链接到特定的glibc版本?


需要澄清:该项目在很大程度上依赖于目标linux的包存储库中的许多第三方依赖项。此外,我使用可以隐式和显式加载的动态.so模块。

如今,有了基于容器的docker和现代CI/CD管道,我们不再像以前那样经常依赖流程编译了。

在musl的帮助下,我们甚至可以创建具有静态链接的通用Linux二进制文件:我们使用所有静态库,而不是动态库。然后我们运送一个可执行文件。

根据musl的文档,它需要

Linux内核>2.6.39

这是2011年左右发布的一个非常旧的版本,所以即使是旧的Linux发行版也可以运行我们的二进制文件。

Musl被广泛应用于许多项目中,尤其是在Rust项目中,我们为用户提供Musl构建作为便利。

请注意,在使用Musl时,我们可能需要修复我们的代码库,与GNU libc有非常细微的差异,我们应该意识到这一点。

最新更新