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++标准库。
正确的做法是用g++:
g++ 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 |
-std=c++17 | 指定C++语言标准 | g++ main.cpp -std=c++17 -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 |
-std=c++17这个参数在当前环境下越来越常用。很多现代C++教程都基于C++17甚至C++20标准撰写,如果你在编译时遇到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和13:
sudo 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 found | gcc未安装或不在PATH中 | 安装build-essential;检查PATH |
undefined reference to std::cout | 用gcc编译C++程序 | 改用g++编译或链接 |
fatal error: iostream: No such file or directory | C++头文件缺失或编译命令不对 | 确认使用g++且已安装g++ |
cannot 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 | 编译标准未指定新版本 | 加-std=c++17或更高 |
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 -y- make:项目构建工具,一套规则文件就能自动处理源文件的编译和链接,大型项目必备。
- cmake:跨平台的构建系统生成器,现代C++项目的标配,很多开源库都要求用cmake编译。
- gdb:GNU调试器,程序崩溃或逻辑出错时,它是排查问题最趁手的工具。
一次装齐的好处是,后面你再碰开源软件时,基本不会遇到“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", "-std=c++17", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"], "group": { "kind": "build", "isDefault": true } } ] }保存后按Ctrl+Shift+B即可编译当前打开的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++打交道的前几段路铺平。