目录
- 第一步:环境准备
- 安装 GCC 编译器
- 安装 GDB 调试器
- 选择代码编辑器
- 第二步:编写你的第一个 C 程序 ("Hello, World!")
- 创建源代码文件
- 代码解释
- 第三步:编译和运行程序
- 使用
gcc命令 - 运行可执行文件
- 常用编译选项 (
-o,-Wall,-g)
- 使用
- 第四步:使用 GDB 进行调试
- 编译时加入调试信息
- 启动 GDB
- 常用 GDB 命令 (
break,run,next,print,continue,quit)
- 第五步:多文件项目管理
- 项目结构
main.c,utils.h,utils.c示例- 使用
gcc编译多个文件 - 使用
Makefile进行自动化构建
- 第六步:进阶主题
- 使用 IDE (如 VS Code)
- 版本控制 (Git)
第一步:环境准备
在开始之前,你需要确保你的 Linux 系统上安装了必要的工具。

安装 GCC 编译器
GCC (GNU Compiler Collection) 是 Linux 下最常用的 C/C++ 编译器。
打开你的终端,根据你的发行版使用相应的包管理器安装。
对于 Debian / Ubuntu / Mint:
sudo apt update sudo apt install build-essential
build-essential 是一个元数据包,它会自动安装 gcc, g++, make 等编译所必需的核心工具。

对于 Fedora / CentOS / RHEL:
sudo dnf groupinstall "Development Tools"
或者
sudo yum groupinstall "Development Tools"
对于 Arch Linux:
sudo pacman -S base-devel
安装完成后,你可以通过以下命令验证 GCC 是否安装成功:

gcc --version
你应该能看到 GCC 的版本信息。
安装 GDB 调试器
GDB (GNU Debugger) 是一个强大的命令行调试工具。
对于 Debian / Ubuntu / Mint:
sudo apt install gdb
对于 Fedora / CentOS / RHEL:
sudo dnf install gdb
对于 Arch Linux:
sudo pacman -S gdb
验证安装:
gdb --version
选择代码编辑器
你可以使用任何你喜欢的文本编辑器来编写 C 代码。
- Vim / Nano: 终端下的轻量级编辑器,非常高效。
- VS Code (Visual Studio Code): 强大的免费开源编辑器,通过插件可以提供出色的 C/C++ 开发体验(代码补全、调试集成等)。
- CLion: 专业的 C/C++ IDE,但需要付费(有免费的学生版和试用期)。
对于初学者,VS Code 是一个非常好的选择,因为它既强大又易于上手。
第二步:编写你的第一个 C 程序
让我们从最经典的 "Hello, World!" 开始。
创建源代码文件
打开终端,创建一个项目目录,然后创建一个名为 hello.c 的文件。
mkdir my-c-project cd my-c-project nano hello.c
(如果你使用 nano,按 Ctrl+O 保存,按 Ctrl+X 退出,如果使用 vim,按 Esc,然后输入 wq 保存退出。)
代码解释
在 hello.c 文件中输入以下代码:
#include <stdio.h> // 1. 包含标准输入输出库
// 2. main 函数是 C 程序的入口点
int main() {
// 3. printf 函数用于在屏幕上打印文本
printf("Hello, World!\n");
// 4. main 函数返回 0,表示程序成功执行完毕
return 0;
}
代码解释:
#include <stdio.h>: 这是一个预处理指令,它会告诉编译器在编译前将stdio.h文件的内容包含进来。stdio.h(Standard Input/Output) 是一个标准库,包含了像printf(格式化输出) 和scanf(格式化输入) 这样的函数。int main(): 这是程序的主函数,当你的程序运行时,操作系统会首先调用这个函数。int表示这个函数会返回一个整数值。printf("Hello, World!\n");:printf函数在屏幕上打印引号内的字符串。\n是一个转义字符,代表一个换行符。return 0;: 这行代码执行后,main函数结束,并向操作系统返回0,在 Unix/Linux 系统中,返回0通常表示程序成功执行,非零值则表示程序遇到了错误。
第三步:编译和运行程序
我们使用 gcc 编译器将 hello.c 转换为可执行的机器码。
使用 gcc 命令
在终端中,确保你还在 my-c-project 目录下,运行以下命令:
gcc hello.c
如果编译成功,你不会看到任何成功信息,但当前目录下会多一个名为 a.out 的文件,这是 GCC 默认输出的可执行文件名。
运行可执行文件
在 Linux 中,运行当前目录下的可执行文件,需要使用 前缀。
./a.out
你应该会在终端看到输出:
Hello, World!
常用编译选项
gcc 非常强大,通过选项可以控制编译过程。
-
-o(指定输出文件名)a.out不够直观,我们可以用-o来指定一个更有意义的名字。gcc hello.c -o hello
这会生成一个名为
hello的可执行文件,运行它:./hello
-
-Wall(显示所有警告) 这是一个非常重要的选项,它会开启所有常见的编译警告,警告不是错误,但它们可以帮助你发现潜在的问题和不规范写法。gcc -Wall hello.c -o hello
即使没有警告,养成使用
-Wall的习惯也是好的。 -
-g(包含调试信息) 如果你想使用 GDB 进行调试,必须在编译时加上-g选项,这样编译器才会生成调试器需要的符号表信息。gcc -g -Wall hello.c -o hello
第四步:使用 GDB 进行调试
让我们人为地在代码中制造一个 bug 来演示 GDB 的用法。
修改 hello.c 如下:
#include <stdio.h>
int add_numbers(int a, int b) {
int sum = a + b; // 故意写错成 a - b
return sum;
}
int main() {
int x = 5;
int y = 10;
int result = add_numbers(x, y);
printf("The result is: %d\n", result); // 预期输出 15,实际会输出 -5
return 0;
}
编译时加入调试信息
使用 -g 选项重新编译:
gcc -g -Wall hello.c -o hello
启动 GDB
在终端输入 gdb 并指定要调试的可执行文件:
gdb ./hello
你会进入 GDB 的交互式界面,类似这样:
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) ...
...
Reading symbols from ./hello...
(gdb)
(gdb) 是 GDB 的提示符。
常用 GDB 命令
在 (gdb) 提示符下输入命令:
-
l(list) 显示源代码。(gdb) l 1 #include <stdio.h> 2 3 int add_numbers(int a, int b) { 4 int sum = a - b; // 故意写错成 a - b 5 return sum; 6 } 7 8 int main() { 9 int x = 5; 10 int y = 10; ... -
b(break) 在指定行设置断点(程序会在此暂停)。(gdb) b 4 Breakpoint 1 at 0x555555555153: file hello.c, line 4.或者设置函数断点:
(gdb) b add_numbers Breakpoint 2 at 0x55555555514a: file hello.c, line 4. -
r(run) 开始运行程序,直到遇到断点。(gdb) r Starting program: /home/user/my-c-project/hello Breakpoint 1, add_numbers (a=5, b=10) at hello.c:4 4 int sum = a - b; -
n(next) 执行下一行代码(不进入函数内部)。(gdb) n 5 return sum; -
p(print) 打印变量的值。(gdb) p sum $1 = -5 (gdb) p a $2 = 5 (gdb) p b $3 = 10现在我们看到了问题!
sum的值是-5,而不是预期的15。 -
c(continue) 继续运行程序,直到下一个断点或程序结束。(gdb) c Continuing. The result is: -5 Program exited normally.程序打印出错误的结果后正常退出。
-
q(quit) 退出 GDB。(gdb) q A debugging session is active. Inferior 1 [process 12345] will be killed. Quit anyway? (y or n) y
通过 GDB,我们成功地定位了代码中的错误。
第五步:多文件项目管理
当项目变大时,将所有代码都写在一个 .c 文件中是不可行的,通常我们会将代码分为:
- 头文件 (
.h): 包含函数声明、宏定义、结构体等,作为接口。 - 源文件 (
.c): 包含函数的具体实现。
项目结构
my-better-project/
├── main.c // 程序入口
├── utils.h // 函数声明
└── utils.c // 函数实现
示例代码
utils.h
#ifndef UTILS_H #define UTILS_H // 声明一个函数,告诉其他文件这个函数存在 int add(int a, int b); int multiply(int a, int b); #endif // UTILS_H
注意: #ifndef, #define, #endif 是头文件卫士,可以防止头文件被重复包含。
utils.c
#include "utils.h" // 引用自己的头文件
// add 函数的实现
int add(int a, int b) {
return a + b;
}
// multiply 函数的实现
int multiply(int a, int b) {
return a * b;
}
main.c
#include <stdio.h>
#include "utils.h" // 引入我们自己写的头文件
int main() {
int x = 10;
int y = 5;
printf("Sum: %d\n", add(x, y));
printf("Product: %d\n", multiply(x, y));
return 0;
}
使用 gcc 编译多个文件
你可以一次性编译所有文件:
gcc main.c utils.c -o my_program
或者分步编译(推荐,因为只修改了 utils.c 时,只需重新编译它):
# 1. 将 utils.c 编译成目标文件 gcc -c utils.c -o utils.o # 2. 将 main.c 编译成目标文件 gcc -c main.c -o main.o # 3. 将目标文件链接成最终的可执行程序 gcc main.o utils.o -o my_program
.o 文件是目标文件,是机器码,但还没有被链接成一个完整的可执行程序。
使用 Makefile 进行自动化构建
每次都手动输入 gcc 命令很繁琐。Makefile 可以定义一套规则来自动化编译过程。
在 my-better-project 目录下创建一个名为 Makefile 的文件(注意没有后缀名):
Makefile
# 定义变量
CC = gcc # C 编译器
CFLAGS = -Wall -g # 编译选项
TARGET = my_program # 目标文件名
# all 是一个伪目标,表示默认要执行的任务
all: $(TARGET)
# 定义如何从 .o 文件链接生成最终目标
# $@ 表示目标文件名,$^ 表示所有依赖文件
$(TARGET): main.o utils.o
$(CC) $(CFLAGS) $^ -o $@
# 定义如何从 .c 文件生成 .o 文件
# %.o 是模式匹配,代表所有的 .o 文件
# $< 代表第一个依赖文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# clean 是一个伪目标,用于清理生成的文件
clean:
rm -f $(TARGET) *.o
# .PHONY 表示 clean 是一个伪目标,防止和同名文件冲突
.PHONY: clean all
你只需要在终端中输入 make 命令,它就会自动读取 Makefile 并执行编译:
make
如果要清理生成的文件:
make clean
Makefile 是专业项目管理的核心,务必掌握。
第六步:进阶主题
使用 IDE (如 VS Code)
- 安装 VS Code: 从 官网 下载并安装。
- 安装 C/C++ 扩展: 打开 VS Code,进入扩展市场,搜索 "C/C++" 并安装由 Microsoft 发布的那个。
- 打开项目:
File->Open Folder...,选择你的项目文件夹(如my-better-project)。 - 配置编译器: VS Code 通常能自动找到 GCC,如果不行,可以在 VS Code 的设置中指定路径。
- 使用: VS Code 会提供语法高亮、代码补全、错误提示,你可以通过安装 "Code Runner" 等插件实现一键编译,或者配置
tasks.json来集成make命令,调试功能也可以通过图形界面轻松配置。
版本控制
对于任何项目,使用版本控制系统(如 Git)都是至关重要的,它可以跟踪代码的每一次修改,让你可以轻松回滚到旧版本,或者与他人协作。
- 安装 Git:
# Debian/Ubuntu sudo apt install git # Fedora sudo dnf install git
- 初始化仓库:
git init git config --global user.name "Your Name" git config --global user.email "your.email@example.com"
- 添加和提交文件:
git add . git commit -m "Initial commit: Add hello world and utils"
将你的代码托管到 GitHub、GitLab 或 Gitee 上,可以更好地保护你的代码并实现团队协作。
在 Linux 上进行 C 语言开发,核心流程是:
- 编写代码: 使用编辑器创建
.c和.h文件。 - 编译: 使用
gcc将源代码编译成可执行文件。 - 调试: 使用
gdb定位和修复代码中的逻辑错误。 - 构建: 对于多文件项目,使用
Makefile来自动化编译和链接过程。 - 管理: 使用
Git进行版本控制。
这个指南为你提供了一个坚实的基础,随着你经验的增长,你可以进一步探索 C 语言的更多高级特性,如内存管理、指针、多线程、系统调用等,祝你编程愉快!
