Gentoo 编译错误解决方案
本文介绍软件编译错误的常用解决方案。仅限于 gentoo 系统提供的操作,不涉及源代码层面的 bug 修复等内容。
找出错误
无论发生什么错误,知道是什么错误都是第一步。
gentoo 的 emerge 指令会在编译过程中输出 log,且在编译失败后打印错误信息以及日志文件地址等内容。及时查看并找到错误点是解决问题的第一步,也是最重要的一步。
分析错误
这里指的编译错误分为三类:编译前错误、编译期错误、安装期错误。
编译前错误五花八门,但解决难度一般较低,除非是严重的依赖问题。这类问题中大部分已经在Gentoo Package Management一文中提及。这里不赘述。
编译期错误一般不会显示在最后的报错信息中,需要自行到 log 中查找。这类错误一般看起来像是源代码本身的 bug,但实际上绝大多数不过是编译选项、软件选项、编译器选择的问题。这类问题将在下文中作详细讨论。
安装期错误是最让人摸不着头脑的。这类错误也并无统一的解决方案。通常遇到这种错误时,第一时间使用 google 或其他搜索引擎搜索该错误信息。如果没有满意的结果,建议直接向打包者或源代码作者寻求帮助。当然如果你对 linux 系统的了解比较深,可能可以自行解决部分问题。
解决错误的一般方案
如前所述,这里的解决方案针对编译期错误。建议参考下列方案的列写顺序以及错误信息的分析结果有顺序地进行尝试。
- 重试
重试看起来无效,但事实上是可能解决问题的。若重试一次无效,则无需再试。
- 利用搜索引擎
使用搜索引擎直接搜索错误信息是效率最高的搜索方法。但需要注意以下几点。
优先使用英文搜索,再考虑中文。
优先使用 google 搜索,再考虑其他。
如果错误信息看起来与 gentoo 无关联,则在适当位置加入 gentoo 关键字。
- 更换编译器
gcc 和 clang 互换,或者不同版本的同一编译器互换。这在用 clang 或者测试分支的 gcc 作为主编译器的情况下非常有效。
- 减小编译线程数
部分软件编译过程产生的临时文件过大,内存和交换无法负载,就会导致编译失败。
- 设置编译选项
主要是关闭编译优化。
但是还有一些特殊情况,该软件对 CC 及 CXX 的设置要求比较苛刻。比如app-text/enchant-1.6.1-r1
,其要求的设置如下。
CC=x86_64-pc-linux-gnu-gcc
CXX=x86_64-pc-linux-gnu-g++
- 设置软件选项
主要是 USE flag。一般通过错误信息判断可能是哪个 USE flag 管理的功能编译出错,将其禁用即可。
- 控制软件版本
升级或降级。
- 打补丁
前面使用搜索引擎搜索时注意某些软件可能已经给出修复 bug 的补丁。但这些补丁并未直接加入 ebuild。这时需要手动添加。
以x11-misc/pcmanfm-1.2.5
为例。mkdir -p /etc/portage/patches/x11-misc/pcmanfm-1.2.5
。然后将补丁放在该目录下,重新编译即可。
- 等待上游修复 bug
看起来是个逃避问题的选择,但实际上是相当常用且实用的方案。
解决错误的高级方案
以上方案已经足以应对绝大多数编译错误。剩下的部分问题,除了源代码的 bug,其他的基本都可以使用重写 ebuild 解决。这将在后面的文章中介绍。