我正在寻找一种在 Gentoo 上构建完全静态链接的二进制文件的方法。
构建系统是 Meson。我尝试过--prefer-static
但--default_library=static
没有成功。
一个可能的障碍是某些库(例如libevent
和glib
)没有安装静态版本(libc
与 和 一些其他库不同)。我应该emerge
使用一些特殊标志重新运行吗?
答案1
支持所有适用包的静态链接
更安全的方法是使整个系统静态化,而不是仅仅使用--static
Gentoo 特定的库来编译所需的库。static-libs
正如您在在线包存储库,许多软件包支持static
USE 标志。
什么是静态链接?
静态链接对于嵌入式系统或用户无权访问某些应用程序库的设备上的程序非常有用。在基于 Windows 的系统上,这些库通常存储为带有.DLL
扩展名(缩写)的文件Dynamic Linking Library
。在 Linux 上,这些库通常存储为扩展名为.so
或.so.versionNumberOfProgramThatUsesLibrary
(共享对象的缩写)的文件。静态编译时,上面讨论的库文件随编译的程序一起提供,允许用户将完成的程序复制到具有完全写访问权限的主目录,并且程序将使用该主目录中的库文件而不是相同的库文件。用户无权访问的主机系统上的库。要更深入地了解静态链接与动态链接,请参阅:静态和动态(共享)库链接有什么区别?
注意警告
在 Gentoo 的第一年,用户能够从不同阶段的 tarball 构建他们的系统,我很自豪地说我已经做过一两次,使用第一阶段,当时这是公认的过程。看Gentoo Wiki 上的 Stage tarball。。警告内容如下:
不要在引导期间设置这个!导致二进制文件静态链接而不是动态链接
适用于第一阶段。它的存在是为了避免先有鸡还是先有蛋的难题。您不能将库文件包含在使用静态库的程序中,也不能包含在没有库的程序中,因为无法使用静态库构建静态库文件。换句话说:您必须使用主机系统中的动态链接库才能构建静态库并将其包含在程序中。
如何在 Gentoo 上执行此操作
完成为您选择的架构安装手册。
微调您的 USE Flags 和/或配置文件(一个很棒的工具是应用程序-Portage/ufed,USE Flag Editor 的缩写)适用于新安装的系统,但请勿添加
static
或static-libs
.这允许您添加桌面环境、声音支持、内核重建等,并允许基本@system
集继续使用动态库。- 确保步骤 2 完成,没有错误。另请注意,您可以将步骤 2 分成多个部分,例如,启用桌面支持,使用
emerge
并重新运行构建该支持ufed
,并添加某种类型的图形支持,然后emerge
再次重新运行。
- 确保步骤 2 完成,没有错误。另请注意,您可以将步骤 2 分成多个部分,例如,启用桌面支持,使用
再运行
ufed
一次并添加static
和static-libs
USE Flags。然后发出emerge -ea
for--empty-tree --ask
来重建整个树并更新支持static
和static-libs
USE 标志的每个包
我将此方法称为“2 遍防弹方法,又称 2 遍编译”。步骤 2 中的第一遍确保在步骤 3 开始时没有任何问题。如果步骤 3 中的第二遍以某种方式失败,您可以自由修复故障,然后重新启动步骤 3 或使用emerge --resume
并继续了解前面的步骤中的任何内容都不会因您的故障而损坏(在修复故障之前,不会安装出现故障的软件包)。
介子
如果我们看一下dev-util/介子在包存储库中,我们可以看到电子构建它不直接支持static
USE Flag,但它的许多依赖项支持static
或static-libs
,这可以实现您想要的。