musl的GCC包装器与musl的交叉编译器有何不同?

问题描述

我正在尝试使用musl工具链来编译各种程序,例如MariaDB。也就是说,在编译完成后,我不希望对glibc或GNU的链接器有任何依赖。

到目前为止,我一直在使用musl的GCC包装器musl-gcc进行编译。但是,对于像MariaDB这样的大型程序,我很难获得所有必需的库和头文件以及符号链接或为编译doesn't really help添加环境变量。

我在building a cross-compiler targeting musl libc看到提到了this GitHub repo以及其他文档和代码。从交叉编译器上的文档中:

这为您提供了一个完整的,可重定位的以肌肉为目标的工具链,具有C ++支持以及可以将第三方库安装到其自己的库路径。

听起来这可能对我有帮助,但是我不确定这与musl的GCC包装器有何不同,据我所知,它只是改变了GCC查找库和标头等的位置。

最终,我不确定这个交叉编译器与GCC包装器之间到底有什么不同,以及它是否对我有用。当我可以符号链接到现有库并使用GCC包装器时,为什么需要我自己的库路径来安装第三方库?交叉编译器是我应该编译东西的方式吗,尤其是更大的代码库?

解决方法

包装程序要做的就是删除默认库,包括路径并添加替换路径。否则,它依赖于编译器对的观点,即ABI是否足够匹配,以至于认为其针对glibc(*-linux-gnu)的GCC与musl(*-linux-musl)目标一起工作。 / p>

完整的GCC工具链具有多个“目标库”-链接到输出程序中的库,以提供编译器提供的某些功能。其中包括libgcc(软件乘或除,软件浮点等,根据目标拱门是否需要这些东西,以及对异常处理的释放支持),libstd++(C ++标准库)和还有许多其他内容,例如libgomp(与#pragma OMP ...一起使用的GNU OpenMP运行时实现)。从理论上讲,所有这些都可能取决于 specific 目标ABI,包括libc,并且有可能链接到libc中的符号。实际上,只要基本类型定义和其他一些ABI事物相匹配,libgcc基本上就不会=SUMIF(RevenueSheet!A2:A,VIPsheet!A2,RevenueSheet!B2:B) =SUMIF(range,criteria,sumrange) ,并且可以“安全地”与其他libc一起使用。

对于其他对libc依赖更复杂的库,通常不希望针对一个libc的构建可以与另一个libc一起使用。 musl libc为使用glibc链接的库提供了一定程度的ABI兼容,因此希望它们可以正常工作,但是您需要将它们复制到新的库路径中。但是,GCC的C ++标准库标头似乎也很依赖于目标的(libc)系统标头,并且当设置glibc时似乎不能与musl一起使用。可能有一些方法可以完成这项工作(即在包装器中添加C ++支持),但确切的做法是一个开放的问题。

尽管这可以使您工作得更深入,但您发现更多的原因是,您宁愿拥有一个知道的适当的交叉编译器工具链它瞄准肌肉。如今,这些已经很容易构建。但是,如果您发现自己也需要其他第三方库,并且不想自己构建它们,那么仅使用带有可为您提供库二进制文件的发行版的Docker映像(或其他容器)可能更有意义。