Ubuntu安装GCC和G++命令全攻略:从apt安装到版本切换与报错排查
发布时间:2026/10/1 6:16:50 锦皓数字建站

ubuntu安装gcc和gcc c的命令只看这一篇就够了很多人搜“ubuntu安装gcc和gcc c的命令”以为就是复制粘贴一条apt install gcc然后回车的事。这话对了一半我见过太多同学卡在装完之后——编译C报错、GCC版本不对、程序写好了根本跑不起来回头又一脸懵地搜“gcc升级后为啥还是旧版本”这种坑。这篇文章我把Ubuntu下装GCC/G这件事从头到尾捋一遍从标准安装命令到版本切换、离线装包、常见报错排查都覆盖到无论你是刚装好Ubuntu的新手还是已经在里面折腾过的老手都能从中找到能直接用的方案。1. 动手之前先看清这三件事1.1 先检查系统里是不是已经装过了很多人在敲安装命令之前根本没确认过自己的Ubuntu里是不是已经有GCC了。Ubuntu的桌面版通常自带build-essential相关组件服务器版则不一定。如果你在安装前没有检查就可能在“明明装了为什么还提示找不到”这个问题上浪费大量时间。检查已有版本的命令很简单gcc --version g --version如果能正常输出版本号说明已经装过了。如果提示command not found那才需要往下走安装流程。我遇到过不少案例gcc是有的但g没装结果写C时一编译就报错。所以检查的时候就该两个都看一下别只看gcc。1.2 确认Ubuntu版本与软件源状态这一步容易被忽略但它决定了你会装到什么版本的GCC。不同Ubuntu版本的默认软件源里GCC版本差别很大。比如我记得很清楚20.04 LTS默认仓库里的gcc是9.x而22.04 LTS装出来直接就是11.x到了24.04 LTS则已经是13.x了。先看下自己的系统版本lsb_release -a然后确认软件源是通的sudo apt update如果apt update报错说明你的软件源列表有问题那后面的安装大概率也会失败。所以我把这一步放在开工前它的重要性不亚于安装本身。1.3 为什么一定要区分gcc和g这是新手很容易混淆的点。gcc和g虽然是同一个GNU编译器套件里的成员但它们的默认行为不一样。gcc在链接阶段不会自动链接C标准库直接拿gcc去编译C代码经常会报一堆链接错误比如undefined reference to std::cout这种。为了省事我习惯用一句话来记写C用gcc写C用g。当然你也可以全程用g它本身也支持编译C代码但反过来用gcc编译C就会踩坑。后面我会具体演示这两个命令的用法差异。2. Ubuntu安装GCC与G的标准流程2.1 一条apt命令快速搞定执行完上面的检查确认没有安装后最标准的安装命令是这样的sudo apt update sudo apt install gcc g -y第一次执行apt install时系统可能会提示需要用到sudo密码输入当前用户密码即可。-y参数是为了跳过安装过程中的确认提示让命令自动化执行尤其是你在远程通过SSH操作时少一次交互就少一分卡住的风险。安装过程会拉取依赖的库文件比如libc6-dev、libstdc-dev这些这些都是GCC运行时必不可少的底层组件。如果你发现下载速度很慢多半跟软件源镜像有关可以考虑把源换成国内镜像这个后面第5章也会提到。2.2 一步到位安装完整开发工具链如果你不只是想编译单个C/C源文件而是准备长期在这个环境里做开发建议直接装build-essential这个元包。它会一次性把gcc、g、make、libc-dev等一整套编译链都装好非常方便sudo apt install build-essential -y这个包名字叫“essential”真没夸张——它是Ubuntu上C/C开发的基座。比如你后面要编译安装一些开源软件./configure make这套流程就离不开make而make就是由build-essential带进来的。装它一个等于把后面可能遇到的七八个“找不到xxx命令”都提前解决了。2.3 安装后怎么验证是否成功装完不能直接就信了验证一下最稳妥gcc --version g --version make --version另外还可以通过which命令查看编译器的具体安装位置which gcc正常情况下会输出/usr/bin/gcc之类的结果。如果这里能正常输出说明GCC已经进入了系统的PATH环境变量任意目录下都能直接调用。要是which找不到但/usr/bin/gcc这个文件确实存在那多半是PATH配置出了问题这个情况比较少见真遇到时检查一下/etc/environment或~/.bashrc。3. 装完先写好第一个C/C程序验证环境3.1 C语言从源码到可执行文件的完整流程光装不练等于白装。我们从一个最简单的C程序开始。在终端里用任意文本编辑器创建文件比如叫hello.c#include stdio.h int main() { printf(Hello, Ubuntu GCC!\n); return 0; }然后用gcc编译gcc hello.c -o hello这条命令里的-o参数指定输出的文件名。编译完成后目录下会多出一个名为hello的可执行文件运行它./hello终端应该会打印出Hello, Ubuntu GCC!。如果你能走到这一步恭喜你的GCC环境已经可以正常工作了。这个流程严格来说分四个阶段预处理、编译、汇编、链接。gcc一条命令把这四步全做了所以新手一般感知不到内部发生了什么。这里稍微了解一下即可后续深入学习时会有更详细的展开。3.2 C程序编译操作避开链接坑接下来是C这个步骤里就藏着gcc和g行为差异的演示场景。创建一个hello.cpp文件#include iostream int main() { std::cout Hello, C on Ubuntu! std::endl; return 0; }如果你偷懒直接用gcc编译gcc hello.cpp -o hello_cpp大概率会报错终端会甩出一大串undefined reference to std::cout之类的链接错误。原因就是我前文提到的gcc不会自动链接C标准库。正确的做法是用gg hello.cpp -o hello_cpp ./hello_cpp这是整个安装流程里最容易卡住新手的地方也是“gcc和g命令到底有什么区别”这个问题的最佳答案。我还见过一种操作先用gcc -c编译出目标文件这一阶段不会报错最后链接时用g hello.o -o hello_cpp这也是合法的因为链接阶段由g完成时就会自动带上C标准库。但新手没必要这么做老老实实全程用g就行。3.3 编译时最常用的几个参数这里整理一份我日常高频使用的gcc/g参数表基本覆盖绝大多数场景参数作用示例-o指定输出文件名g main.cpp -o app-Wall开启常见警告gcc main.c -Wall -o app-g生成调试信息配合gdb使用g main.cpp -g -o app-O2优化级别提升程序运行效率g main.cpp -O2 -o app-stdc17指定C语言标准g main.cpp -stdc17 -o app-I添加头文件搜索路径g main.cpp -I./include -o app-L添加库文件搜索路径g main.cpp -L./lib -lmylib -o app-l链接指定库g main.cpp -lpthread -o app-stdc17这个参数在当前环境下越来越常用。很多现代C教程都基于C17甚至C20标准撰写如果你在编译时遇到std::filesystem找不到之类的问题多半就是没指定新的标准。后续章节里我会讲到的GCC版本升级也跟这个需求息息相关。4. 版本升级与多版本切换为什么装完还是旧版本4.1 apt安装的GCC版本为什么比你想象中旧我先直接回答那个热搜词“gcc升级后为啥还是旧版本”——必须说这可能是GCC使用中最让人困惑的现象之一。它通常发生在你通过不同渠道安装了新版GCC之后运行gcc --version却仍显示旧版本的情况。根本原因在于Ubuntu系统默认的软件源尤其是LTS版本为了保证系统稳定性会锁定一个较旧的GCC版本只打安全补丁不跟进大版本。举个例子Ubuntu 20.04的官方源里gcc就是9.x就算你的系统已经更新到最新状态它也还是9.x不会变成10或11。这是Ubuntu的稳定性策略不是系统出bug了。4.2 手动安装新版GCC后用update-alternatives接管版本从工具链PPA安装新版后你大概率会遇到“装完了但gcc还是旧版本”的诡异情况。看热搜词就知道这个坑踩的人特别多。先说明工具链PPA的添加方法sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update然后安装你想要的GCC版本比如装12和13sudo apt install gcc-12 g-12 gcc-13 g-13 -y此时你运行gcc --version大概率还是显示旧版本。别慌这很正常——系统里gcc这个命令还指向着原来的版本新装的gcc-12、gcc-13二进制文件还没有接管“gcc”这个名字。这时候就要用update-alternatives来管理系统里的同名称命令。先注册sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 90 sudo update-alternatives --install /usr/bin/g g /usr/bin/g-13 100 sudo update-alternatives --install /usr/bin/g g /usr/bin/g-12 90最后那个数字是优先级数字大的会在自动模式下被优先选中。注册完成后可以用交互式命令手动切换sudo update-alternatives --config gcc sudo update-alternatives --config g执行后会列出当前注册的所有版本按提示输入编号即可切换。切完再运行gcc --version你就会看到想要的版本了。这个机制我拿生活场景打个比方把gcc这个命令当成一个“快捷方式”它本身不直接指向任何编译器而是通过update-alternatives这个管理器指到系统里所有已注册的gcc版本之一。你装的gcc-13是新建了一个“快捷方式目标”但外层快捷方式还指着旧目标所以必须先改外层的指向。4.3 无网络环境或特殊需求下的编译器升级方式如果生产环境是隔离的不能访问外网升级GCC就麻烦一些。一种做法是在一台能联网的同版本Ubuntu机器上用apt把所需deb包下载下来拷贝到目标机器上离线安装。下载deb包的命令如下sudo apt install --download-only gcc-12 g-12下载好的deb文件默认存放在/var/cache/apt/archives/目录下。把这个目录下的.deb文件打包传到目标机器然后使用dpkg安装sudo dpkg -i *.deb如果出现依赖缺失报错再执行sudo apt -f install另外还有一种更“硬核”的方式就是直接源码编译安装GCC。这个流程非常耗时编译GCC本身对机器性能要求不低而且如果目标机器上连早期GCC都没有引导编译的步骤会更繁琐。非特殊情况我都不推荐代价太高容易中途放弃老老实实用deb包离线安装通常够用了。5. 安装失败与运行异常的排查手册5.1 apt安装失败的几个典型原因热搜里有“ubuntu安装gcc失败”这个真不是个别现象。我把最常见的几种失败原因和排查方式列出来按出现频率排序。软件源问题执行apt install时下载速度极慢最终失败或者报404错误基本指向软件源配置异常。Ubuntu安装好后默认使用的是官方源在国内网络环境下经常不稳定。解决办法是换用国内镜像源。以Ubuntu 22.04为例将/etc/apt/sources.list中的archive.ubuntu.com替换为mirrors.aliyun.com或mirrors.tuna.tsinghua.edu.cn即可替换后执行sudo apt update。依赖关系损坏如果apt install报出类似unmet dependencies的错误说明系统里某些包依赖关系乱了。先用以下命令修复sudo apt --fix-broken install然后再尝试安装gcc和g绝大多数依赖问题都能这样解决。dpkg锁占用报错Could not get lock /var/lib/dpkg/lock-frontend时说明有另一个apt进程还在运行。解决办法是等它结束或者强制解锁sudo rm /var/lib/dpkg/lock-frontend这个操作要谨慎最好先看看是不是真的没有apt进程在跑否则强删锁文件可能导致更复杂的dpkg状态问题。5.2 安装后找不到命令的排查方法还有一种情况是安装过程本身很顺利但一执行gcc就提示command not found。遇到这个情况先不要急着重装按顺序排查先看文件是否存在ls -l /usr/bin/gcc再看命令是否在PATH中echo $PATH如果/usr/bin在PATH中且文件存在command not found一般不会出现。还有一个可能你当前用户的shell配置没有刷新重新登录或者执行source ~/.bashrc再试一下。5.3 典型报错信息速查表日常使用GCC编译时下面是几个我见过无数次的报错和解决办法报错信息原因解决办法gcc: command not foundgcc未安装或不在PATH中安装build-essential检查PATHundefined reference to std::cout用gcc编译C程序改用g编译或链接fatal error: iostream: No such file or directoryC头文件缺失或编译命令不对确认使用g且已安装gcannot find -lxxx缺少指定链接库安装对应libxxx-dev包gcc: fatal error: cannot specify -o with -c, -S or -E with multiple files一次编译多个源文件时指定了多个输出名要么每个源文件单独编译要么只指定一次输出目录collect2: error: ld returned 1 exit status链接阶段失败查看前面是否有未定义引用std::filesystem not found in namespace std编译标准未指定新版本加-stdc17或更高5.4 在线安装加速技巧既然搜索热词里有“ubuntu安装教程”和“ubuntu安装失败”说明不少人卡在了下载阶段。这里给一个很实用的源切换示例。编辑软件源列表sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt update如果是Ubuntu 24.04及以后版本软件源改为/etc/apt/sources.list.d/ubuntu.sources格式操作略有不同。手动打开这个文件把http://archive.ubuntu.com/ubuntu/统一替换为http://mirrors.aliyun.com/ubuntu/即可。替换后执行apt update再安装GCC那个体验完全是两个世界。6. 开发环境进阶从命令行到完整工作台6.1 配套工具链顺序安装GCC本身只是编译器但一个完整的开发环境需要多个组件协同。我建议在装完gcc和g后顺手把下面这几个常用开发工具一起装上避免后续做项目时缺东少西。sudo apt install make cmake gdb -ymake项目构建工具一套规则文件就能自动处理源文件的编译和链接大型项目必备。cmake跨平台的构建系统生成器现代C项目的标配很多开源库都要求用cmake编译。gdbGNU调试器程序崩溃或逻辑出错时它是排查问题最趁手的工具。一次装齐的好处是后面你再碰开源软件时基本不会遇到“configure: error: C compiler cannot create executables”这类环境问题。6.2 VSCode搭配C/C插件编写调试体验拉满热搜里好几次出现“vscode配置c/c环境”这里一并提一下。命令行下编辑用的vim、nano虽然够用但写复杂项目时体验确实不如图形化编辑器。VSCode搭配C/C插件是最常见的做法。在Ubuntu里安装VSCode后在插件市场搜索安装C/C插件Microsoft官方出品然后新建settings.json配置编译任务。下面是一份最简可用的tasks.json模板放在项目根目录的.vscode文件夹下{ version: 2.0.0, tasks: [ { label: build with g, type: shell, command: g, args: [-g, -stdc17, ${file}, -o, ${fileDirname}/${fileBasenameNoExtension}], group: { kind: build, isDefault: true } } ] }保存后按CtrlShiftB即可编译当前打开的C文件再配上调试面板的launch.json配置就能在代码里加断点、看变量、单步执行。完整的VSCode调试配置虽然要花点时间研究但一劳永逸。如果你主要用命令行也可以直接在终端里用gdb调试效果一样。6.3 装完环境之后如何高效上手练习很多读者装GCC是因为想学C/C编程热点里就出现了“c小游戏”“冒泡排序算法c”“c 二分查找”这些词。装好环境只是起点真正进步靠的是持续编码。我个人建议从二三十行的经典算法题目开始比如冒泡排序、二分查找需要的数组和指针操作一段一段写、编译、运行把GCC的报错当成你的免费老师。等语法熟练后再试着用控制台做一个猜数字小游戏或者贪吃蛇。这一步能倒逼你去掌握头文件组织、函数拆分、输入输出处理等更多细节比看多少篇教程都管用。熟悉编译器之后还可以尝试写一个小脚本或配一个自动编译的Makefile。用Makefile管理多文件项目时你会发现它是提升效率的好工具。要点就一条GCC是工具真正的核心是你常用的代码逻辑和调试思路工具链会用就行不必追求掌握每个细节。最后再分享一个我在实际操作中的习惯装完任何新版本GCC后我不会急着删旧版本。多版本共存用update-alternatives管理着切换起来很方便但万一新版对某个老项目不兼容随时能切回去这个退路很重要。尤其是接手别人的代码时编译环境越贴近原作者的踩坑越少。另一个小技巧是写一个简单的脚本把安装、验证、注册alternatives这几步一键执行以后在新机器上配环境的时间能从半小时压缩到三分钟。GCC的坑说多不多但每一个都足够让新手卡上一阵子希望这篇能把你在Ubuntu下与GCC/N打交道的前几段路铺平。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。