最近几个月,重新玩起了Gentoo,没事的时候,经常emerge world,遇到过几次和gcc有关的报错:

  • error: C compiler cannot create executables
  • gcc-config: Active gcc profile is invalid!

简单记录一下排查的过程和解决方法:

无法创建可执行程序

在使用 emerge -avtuDN world升级系统时候,遇到编译 sandbox 报错,检查build.log有如下提示

configure: error: in `/var/tmp/portage/sys-apps/sandbox-2.7/work/build-x86':
configure: error: C compiler cannot create executables
See `config.log' for more details

这是因为我在编译内核的时候,取消了 32位支持

Executable file formats / Emulations  ---> 
    [ ] IA32 Emulation

但是,在 /etc/portage/make.conf 中没有指定 -multilib ,所以导致不少程序编译的时候会尝试同时编译支持32程序,这就导致无法完成。

为何最初没有出现问题?

最初我选择 eselect profile list 时候,选择的是 hardened/linux/amd64/no-multilib ,但是最近我想编译安装KDE,所以将 eselect 转换成了 default/linux/amd64/13.0/desktop/plasma ,这导致默认很多程序都带上了multilib编译FLAG。

所以重新切换回 no-multilib

eselect profile set 11
emerge --ask --changed-use --deep world

这里重新做一次emerge world,参考 KDE Plasma 5 upgrade

但是出现提示错误(我使用了 -qt4

emerge: there are no ebuilds built with USE flags to satisfy ">=dev-libs/libdbusmenu-qt-0.3.2[qt4(+)]".
!!! One of the following packages is required to complete your request:
- dev-libs/libdbusmenu-qt-0.9.3_pre20140619-r1::gentoo (Change USE: +qt4)
(dependency required by "kde-base/kdelibs-4.14.11::gentoo" [ebuild])
(dependency required by "media-video/vlc-2.2.1::gentoo[kde]" [ebuild])
(dependency required by "@selected" [set])
(dependency required by "@world" [argument])

尝试使用 emerge --unmerge dev-libs/libdbusmenu-qt 提示如下

!!! CONFIG_PROTECT is empty
 * This action can remove important packages! In order to be safer, use
 * `emerge -pv --depclean <atom>` to check for reverse dependencies before
 * removing packages.
--- Couldn't find 'dev-libs/libdbusmenu-qt' to unmerge.

>>> No packages selected for removal by unmerge

检查不需要的软件包

emerge -pv --depclean

提示

>>> 'Selected' packages are slated for removal.
>>> 'Protected' and 'omitted' packages will not be removed.

Packages installed:   458
Packages in world:    36
Packages in system:   44
Required packages:    434
Number to remove:     24

确认这些软件包删除没有问题,则清理掉

emerge --depclean

然后重新执行一次系统编译

emerge --ask --changed-use --deep world

问题实在太多了,发现很难解决KDE编译时候需要的USE FLAG设置,所以还是eselect profile设置选择default/linux/amd64/13.0/desktop/plasma,同时设置 make.conf 中添加 -multilib。注意,部分软件包需要qt4支持,所以让系统自动选择对部分软件包添加qt4支持。

但是还是会出现 sandbox 无法编译,我检查了

emerge --info
emerge -pv gcc

发现gcc编译自动添加了 multilib (即使我在 make.conf 中加了 -multilib),所以make.conf去掉了 -multilib ,然后先编译 gcc ,再重新编译整个系统。汗,还是错误,发现原先选择的纯64位系统,会出现

/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory

唉,还是难以解决64位为题,所以我切换回 no-multilib 的 profile,想办法逐步解决 KDE 编译参数。

gcc profile错误

另一次遇到C compiler cannot create executables也是做emerge -avtuDN world时候遇到

checking for x86_64-pc-linux-gnu-gcc... x86_64-pc-linux-gnu-gcc
checking whether the C compiler works... no
configure: error: in `/var/tmp/portage/app-eselect/eselect-python-20151117-r2/work/eselect-python-20151117':
configure: error: C compiler cannot create executables

检查了eselect profile list,确实选择的是纯64位模式

[11]  default/linux/amd64/13.0/no-multilib *

我尝试在/etc/portage/make.conf中添加-multilib,但是没有解决问题,并且也无法编译gcc自身。

使用Hello World程序编译测试了一下

gcc -Wall helloworld.c -o helloworld

显示输出

 * gcc-config: Active gcc profile is invalid!
gcc-config: error: could not run/locate 'gcc'

使用命令 gcc-config -l显示输出

* gcc-config: Active gcc profile is invalid!
[1] x86_64-pc-linux-gnu-4.9.3

原来是因为我前面使用了 emerge --depclean 结果卸载了旧版本的 sys-devel/gcc-4.8.5 导致了gcc-config没有切换到新版本。

参考gcc-config: Active gcc profile is invalid!,很简单,就是使用命令

gcc-config 1

将指向切换到新版本就可以。

参考