【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 是否生效、是否在正确目录。
相关推荐
云泽8089 小时前
STM32 USART 详解(八):C I/O 串口重定向原理与实现
c语言·stm32·嵌入式硬件
ThornArmor9 小时前
重铸1996|肉体渲染:关节的裂缝:分段模型积木拼装与未成熟的 RSP 矩阵骨骼动画形变
c语言·汇编·c++·python·硬件架构·游戏机
T1mzhou9 小时前
ARM64 Linux 6.10 内核驱动(12):dd.c:probe/ remove、延迟 probe
linux·服务器·c语言·arm开发·arm
白色的北极熊11 小时前
c语言 scanf 输入流有空格,逗号 说明
c语言
Logic10111 小时前
C语言/数据结构位运算题解:异或XOR找出货船中的“独特载货量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Zwawa14 小时前
重新认识结构体:为什么 STM32 库函数喜欢接收一大包参数
嵌入式
xx~t14 小时前
嵌入式——51单片机3
linux·c语言·嵌入式硬件·51单片机
星源~15 小时前
Linux - Trae Code Linux 环境嵌入式开发指南
linux·mcu·嵌入式·trae code
山下梅子酒22515 小时前
洛谷-入门-B2042
c语言
ysu_031415 小时前
08-二叉树遍历:四种方式详解
c语言·数据结构·算法·leetcode