【C语言】01-从零开始:编译运行与第一个程序

作者简介

Nebula嵌入式 | 嵌入式软件工程师

🏆技术背景:

22届普通二本院校毕业生

专注于嵌入式软件开发(MCU/RTOS/Linux应用/Linux驱动开发 持续学习中)

📚内容创作:

小红书、抖音、B站同名账号,分享嵌入式知识和日常工作,欢迎关注!

一、前言

本文不讲语法细节,只帮你:搭好环境、跑通 Hello World、知道源码如何变成可执行文件 。读完后应能独立编译、运行一个 .c 文件。

零基础最容易卡在「代码没错,但电脑找不到 gcc」。所以本文把安装和排查写细一点;语法从下一篇开始讲。

二、需要准备什么

读图要点:

  • 写 C 只要三件套:编辑器写源码、编译器生成可执行文件、终端执行与看报错。
  • 先确认终端里 gcc --version 能输出,再谈 Hello World,避免卡在环境上。
  1. 编辑器:VS Code(或你习惯的任意编辑器)。本专栏不绑定 IDE。
  1. 编译器 :能在终端运行的 gcc(或兼容的 clang)。
  1. 终端
    • Windows:PowerShell、CMD,或 MSYS2 自带终端
    • Linux / macOS:系统终端 / bash / zsh

验证是否就绪:

复制代码
gcc --version

能打印出版本号即可继续。若提示「不是内部或外部命令」/ command not found,先完成下面的安装节。

三、Windows 安装编译器(推荐 MSYS2)

MinGW-w64 有多种来源,新手推荐 MSYS2:包管理清晰,后续装工具也方便。

3.1 安装 MSYS2

  1. 打开 MSYS2,下载安装包并安装(路径勿含中文,例如 C:\msys64)。
  1. 打开 「MSYS2 UCRT64」 终端(开始菜单里搜这个名字)。
  1. 更新并安装编译器:

    pacman -Syu

    若提示关闭终端,关掉再开一次 UCRT64,再执行:

    pacman -Su
    pacman -S --needed mingw-w64-ucrt-x86_64-gcc make

  2. 同一个 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 | 终端不在源码目录 | cdhello.c 所在路径,或用 ls/dir 确认 |
| 一堆 stdio.h: No such file | 装了残缺工具链 | MSYS2 用 UCRT64 并安装文中的 mingw-w64-ucrt-x86_64-gcc |
| 能编译不能运行 / 闪退 | 双击 exe 窗口一闪 | 在终端里运行,才能看到输出 |
| 中文路径、空格路径怪异 | 工具链对路径不友好 | 练习目录尽量用英文路径,如 D:\learn\c |
| 杀毒软件拦截 exe | 误报 | 把练习目录加白名单,或仅在终端运行 |

自检清单(按顺序勾):

  1. gcc --version 有输出
  1. 终端当前目录能看到 hello.c
  1. gcc -Wall -Wextra -std=c99 hello.c -o hello 无报错
  1. 运行后打印 Hello, C!

九、小结

  • 会写、会编译、会运行一个含 main 的程序。
  • 知道预处理 → 编译 → 汇编 → 链接四步。
  • 养成加 -Wall 的习惯。
  • 环境问题优先查:是否装对工具链、PATH 是否生效、是否在正确目录。
相关推荐
luj_17682 小时前
随机性在算法与占卜中的共通原理
c语言·开发语言·c++·经验分享·算法
Chen—LSN2 小时前
C语言——深度理解指针(5)
c语言·数据结构·算法·排序算法
智闲电子设计3 小时前
STM32 定时器 PWM 实战:从呼吸灯到舵机控制
c语言·stm32·单片机·嵌入式硬件·学习
程序员老舅10 小时前
啃透 I2C 驱动开发,才算入门嵌入式 Linux 内核驱动
数据结构·驱动开发·b树·内核·嵌入式·嵌入式开发·i2c
2601_9555181817 小时前
C语言标准演化史:从K&R到GNU,谁才是正统?
c语言·gnu·标准演化·ansic·性能与可移植性
程序员zgh18 小时前
C++ 拷贝赋值运算符 详解
c语言·开发语言·c++
小婷一直在努力20 小时前
自定义类型:联合和枚举
c语言·联合和枚举
Embedded-Xin20 小时前
Rust学习——Cargo工具
linux·学习·架构·rust·嵌入式
夕阳23020 小时前
做耳机开发,需要掌握哪些 C 语言知识?
c语言·开发语言·#蓝牙开发·#蓝牙技术