作者简介
Nebula嵌入式 | 嵌入式软件工程师
🏆技术背景:
22届普通二本院校毕业生
专注于嵌入式软件开发(MCU/RTOS/Linux应用/Linux驱动开发 持续学习中)
📚内容创作:
小红书、抖音、B站同名账号,分享嵌入式知识和日常工作,欢迎关注!
一、前言
本文不讲语法细节,只帮你:搭好环境、跑通 Hello World、知道源码如何变成可执行文件 。读完后应能独立编译、运行一个 .c 文件。
零基础最容易卡在「代码没错,但电脑找不到 gcc」。所以本文把安装和排查写细一点;语法从下一篇开始讲。
二、需要准备什么

读图要点:
- 写 C 只要三件套:编辑器写源码、编译器生成可执行文件、终端执行与看报错。
- 先确认终端里 gcc --version 能输出,再谈 Hello World,避免卡在环境上。
- 编辑器:VS Code(或你习惯的任意编辑器)。本专栏不绑定 IDE。
- 编译器 :能在终端运行的
gcc(或兼容的clang)。
- 终端:
-
- Windows:PowerShell、CMD,或 MSYS2 自带终端
-
- Linux / macOS:系统终端 / bash / zsh
验证是否就绪:
gcc --version
能打印出版本号即可继续。若提示「不是内部或外部命令」/ command not found,先完成下面的安装节。
三、Windows 安装编译器(推荐 MSYS2)
MinGW-w64 有多种来源,新手推荐 MSYS2:包管理清晰,后续装工具也方便。
3.1 安装 MSYS2
- 打开 MSYS2,下载安装包并安装(路径勿含中文,例如
C:\msys64)。
- 打开 「MSYS2 UCRT64」 终端(开始菜单里搜这个名字)。
-
更新并安装编译器:
pacman -Syu
若提示关闭终端,关掉再开一次 UCRT64,再执行:
pacman -Su
pacman -S --needed mingw-w64-ucrt-x86_64-gcc make -
在 同一个 UCRT64 终端里验证:
gcc --version
3.2 让 PowerShell / CMD 也能找到 gcc(可选)
若希望在 Windows 自带终端里直接用 gcc,把下面目录加入系统 PATH(按你的安装路径改):
C:\msys64\ucrt64\bin
操作路径:设置 → 系统 → 关于 → 高级系统设置 → 环境变量 → 用户/系统 Path → 新建 → 粘贴上述路径 → 确定。
重新打开 一个新的 PowerShell,再执行 gcc --version。
不想改 PATH 也可以:平时只用 MSYS2 UCRT64 终端编译,完全够入门。
3.3 其他选择(了解即可)
- 直接安装独立 MinGW-w64 发行版,同样需把
bin加入 PATH。
- 用 Visual Studio 的
cl也行,但本专栏示例默认按 gcc 命令行书写。
四、Linux / macOS 安装
Debian / Ubuntu:
sudo apt update
sudo apt install build-essential
gcc --version
Fedora:
sudo dnf install gcc make
macOS:
xcode-select --install
# 装好后终端里应有 clang;许多环境也可通过 Homebrew 装 gcc
clang --version
macOS 上用 clang 跑本专栏示例通常没问题;若命令写成 gcc,多数情况下是 clang 的别名,注意看 --version 输出。
五、第一个程序

读图要点:
- 闭环顺序:写 .c → gcc 编译 → 运行可执行文件 → 看终端输出。
- 编译命令在源文件所在目录执行;Windows 下产物常是 hello.exe。
5.1 写文件
任选一个工作目录,新建 hello.c:
#include <stdio.h>
int main(void)
{
printf("Hello, C!\n");
return 0;
}
用 VS Code:文件 → 打开文件夹 → 新建 hello.c → 粘贴保存。
5.2 编译并运行
在该文件所在目录打开终端:
gcc -Wall -Wextra -std=c99 hello.c -o hello
运行:
./hello # Linux / macOS / MSYS2
hello.exe # Windows CMD / PowerShell(若生成的是 hello.exe)
看到 Hello, C! 即成功。return 0 表示程序正常结束。
VS Code 小提示:可用菜单「终端 → 新建终端」,默认就在当前工作区目录,免得到处 cd。
六、编译链接在做什么
一键 gcc hello.c -o hello 其实做了多步。简化流程:

读图要点:
- 一键 gcc 内部仍是四步:预处理 → 编译 → 汇编 → 链接。
- 分步生成 .i/.s/.o 便于理解报错发生在哪一环,日常开发用一键即可。
对应关系简述:
- 预处理 :展开
#include、#define等,得到.i
- 编译 :把 C 翻译成汇编,得到
.s
- 汇编 :汇编变成目标文件,得到
.o
- 链接 :多个
.o与库合并成可执行文件
常用分步查看(帮助建立直觉,不必每次都手敲):
gcc -E hello.c -o hello.i # 只看预处理结果
gcc -S hello.c # 生成 hello.s
gcc -c hello.c # 生成 hello.o(不链接)
gcc hello.o -o hello # 链接
多文件时:每个 .c 先编成 .o,再链接在一起。头文件只放声明,定义放在某一个 .c 里(后续函数篇会练)。
七、常用 gcc 命令
|-------------------------|---------------------|
| 命令 | 作用 |
| gcc a.c -o a | 一键生成可执行文件 |
| -Wall -Wextra | 打开常用警告(强烈建议) |
| -std=c99 / -std=c11 | 指定语言标准 |
| -g | 带调试信息,方便 gdb |
| -O0 / -O2 | 优化级别;入门用 -O0 更易对照 |
嵌入式交叉编译只是把 gcc 换成 arm-none-eabi-gcc 等,流程相同。先在 PC 上把「编辑 → 编译 → 运行」闭环跑熟。
八、常见卡点排查
|--------------------------------------|------------------|---------------------------------------------------|
| 现象 | 常见原因 | 怎么办 |
| gcc 不是内部或外部命令 | 未装编译器,或 PATH 未生效 | 按第三节安装;改 PATH 后重开终端 |
| No such file or directory: hello.c | 终端不在源码目录 | cd 到 hello.c 所在路径,或用 ls/dir 确认 |
| 一堆 stdio.h: No such file | 装了残缺工具链 | MSYS2 用 UCRT64 并安装文中的 mingw-w64-ucrt-x86_64-gcc |
| 能编译不能运行 / 闪退 | 双击 exe 窗口一闪 | 在终端里运行,才能看到输出 |
| 中文路径、空格路径怪异 | 工具链对路径不友好 | 练习目录尽量用英文路径,如 D:\learn\c |
| 杀毒软件拦截 exe | 误报 | 把练习目录加白名单,或仅在终端运行 |
自检清单(按顺序勾):
gcc --version有输出
- 终端当前目录能看到
hello.c
gcc -Wall -Wextra -std=c99 hello.c -o hello无报错
- 运行后打印
Hello, C!
九、小结
- 会写、会编译、会运行一个含
main的程序。
- 知道预处理 → 编译 → 汇编 → 链接四步。
- 养成加
-Wall的习惯。
- 环境问题优先查:是否装对工具链、PATH 是否生效、是否在正确目录。