从源码安装gcc-8.1后执行gcc -v提示路径为目录的问题求助
让我们一步步拆解你的问题,先梳理安装步骤的问题,再解决当前的报错:
一、你的GCC源码安装步骤存在关键错误
你在configure阶段设置的--prefix=/usr/bin/gcc-8.1是完全错误的——prefix指定的是GCC安装的根目录,configure会自动在这个目录下创建bin、lib、include等子目录存放对应文件。你把prefix设成了/usr/bin下的一个子目录,导致GCC的二进制文件最终被安装到了/usr/bin/gcc-8.1/bin里,而不是你预期的/usr/bin下,这直接引发了后续的所有问题。
另外,你把wget和tar命令写在了同一行,这会导致tar命令无法正确执行(因为wget的输出还没结束就开始执行tar),正确的做法是分成两行执行。
其他步骤比如apt build-dep gcc、./contrib/download_prerequisites、make -j8这些是没问题的。
二、当前报错的原因
bash: /usr/bin/gcc: Is a directory:因为你在update-alternatives里指定的路径/usr/bin/gcc-8.1是一个目录(而不是可执行文件),系统尝试把/usr/bin/gcc链接到这个目录,导致/usr/bin/gcc变成了目录而非可执行链接,所以执行gcc -v时会报错。update-alternatives: warning: skip creation of /usr/bin/g++...:同样因为prefix设置错误,g++-8.1并没有被安装到/usr/bin下,而是在/usr/bin/gcc-8.1/bin里,所以update-alternatives找不到对应的文件。
三、修复步骤
1. 清理错误的安装与链接
首先把错误的配置和安装文件清理干净:
# 移除错误的update-alternatives条目 sudo update-alternatives --remove gcc /usr/bin/gcc-8.1 # 删除错误的安装目录 sudo rm -rf /usr/bin/gcc-8.1 # 如果/usr/bin/gcc现在是目录,删除它 sudo rm -rf /usr/bin/gcc
2. 重新正确编译安装GCC 8.1.0
回到之前的编译目录(如果已经删除,重新解压源码包即可),重新执行configure和编译:
# 进入之前创建的objdir目录(如果不存在就重新创建) cd objdir # 清理之前的编译残留 make clean # 重新配置,使用正确的prefix(推荐安装到/usr/local下,不干扰系统默认工具) $PWD/../gcc-8.1.0/configure --prefix=/usr/local/gcc-8.1 --enable-languages=c,c++,fortran,go --disable-multilib # 重新编译(-j8根据你的CPU核心数调整) make -j8 # 安装到指定目录 sudo make install
这里--prefix=/usr/local/gcc-8.1是标准的本地软件安装路径,不会覆盖系统自带的GCC版本,也方便后续管理。
3. 正确配置update-alternatives
现在GCC 8.1的可执行文件在/usr/local/gcc-8.1/bin/gcc和/usr/local/gcc-8.1/bin/g++,我们把它们添加到update-alternatives:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-8.1/bin/gcc 60 --slave /usr/bin/g++ g++ /usr/local/gcc-8.1/bin/g++
然后选择你要使用的GCC版本:
sudo update-alternatives --config gcc
在弹出的列表中输入对应GCC 8.1的编号,按回车确认即可。
4. 验证修复结果
执行以下命令验证安装是否成功:
gcc -v g++ -v
如果输出显示gcc version 8.1.0,说明问题已经解决。
四、额外提醒
- 以后编译源码软件时,
--prefix尽量不要设到/usr/bin、/usr/lib这类系统默认路径下,推荐用/usr/local/软件名或者/opt/软件名,避免干扰系统自带工具。 ./contrib/download_prerequisites这一步一定要执行,它会自动下载GCC编译所需的依赖库(如mpfr、gmp等),跳过的话会导致编译失败。
内容的提问来源于stack exchange,提问作者Ja_cpp

