最简单的编译和运行
这是 GCC 最核心、最基础的两个步骤。

编译
将一个 C 语言源文件(hello.c)编译成一个可执行文件。
gcc hello.c -o hello
命令分解:
gcc: 调用 GCC 编译器。hello.c: 指定要编译的源文件。-o hello: 指定输出的可执行文件名。-o是选项,hello是你给可执行文件起的名字。如果不加-o,GCC 默认会生成一个名为a.out的文件。
运行
编译成功后,你会得到一个可执行文件(在 Windows 上可能是 hello.exe),在终端中运行它:
-
在 Linux 或 macOS 上:
(图片来源网络,侵删)./hello
告诉终端在当前目录下查找这个可执行文件。
-
在 Windows (命令提示符或 PowerShell) 上:
hello.exe
完整示例:
假设你有一个 hello.c 文件,内容如下:

#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
在终端中执行以下命令:
# 1. 编译 gcc hello.c -o hello # 2. 运行 ./hello
预期输出:
Hello, World!
常用编译选项
在实际开发中,我们通常会使用更多的选项来控制编译过程。
调试选项:-g
生成包含调试信息(如变量名、行号)的可执行文件,这样你才能使用 GDB 等调试工具来分析程序。
gcc -g hello.c -o hello_debug
优化选项:-O1, -O2, -O3, -Ofast
对生成的代码进行优化,以提高程序运行速度,数字越大,优化级别越高,但编译时间也越长。
-O1: 基础优化。-O2: 推荐的优化级别,在性能和编译时间之间取得了很好的平衡。-O3: 更激进的优化,可能会显著增加代码大小。-Ofast: 类似于-O3,但还会启用一些不严格遵循标准的优化(如-ffast-math)。
# 使用 O2 优化级别进行编译 gcc -O2 hello.c -o hello_optimized
注意:在调试时,通常不使用或使用较低的优化级别(如 -O0,即不优化),因为高优化可能会改变代码执行顺序,使调试变得困难。
警告选项:-Wall, -Wextra
让 GCC 编译器尽可能多地输出警告信息。强烈建议在编译时始终开启 -Wall,这可以帮助你发现很多潜在的错误。
-Wall: 启用所有常见的警告。-Wextra: 启用一些额外的、不那么常见的警告。
# 开启所有警告进行编译 gcc -Wall hello.c -o hello_with_warnings
示例: 如果你写了这样一段有问题的代码:
#include <stdio.h>
int main() {
int a = 10;
int b; // 变量 b 被定义但未初始化
a = b; // 使用了未初始化的变量 b
printf("%d\n", a);
return 0;
}
使用 gcc -Wall 编译,你会得到警告:
hello.c: In function 'main':
hello.c:7:7: warning: 'b' is used uninitialized in this function [-Wuninitialized]
a = b;
^
标准选项:-std
指定 C 语言的标准版本,这有助于保证代码的可移植性并使用特定版本的特性。
-std=c89/-std=iso9899:1990: C89/C90 标准。-std=c99/-std=iso9899:1999: C99 标准,引入了很多有用的特性。-std=c11/-std=iso9899:2011: C11 标准。-std=c17/-std=iso9899:2025: C17 标准。-std=gnu11: GNU 对 C11 的扩展,默认情况下 GCC 就使用这个。
# 按照C99标准编译 gcc -std=c99 -Wall hello.c -o hello_c99
多文件编译
在实际项目中,代码通常分布在多个文件中,GCC 可以一次性编译多个源文件。
假设你的项目有三个文件:
main.c: 包含main函数。utils.c: 包含一些辅助函数。utils.h:utils.c中函数的声明(头文件)。 示例:**
utils.h
// 函数声明 void print_message(const char *msg); int add(int a, int b);
utils.c
#include <stdio.h>
#include "utils.h" // 引用自己的头文件
void print_message(const char *msg) {
printf("Message: %s\n", msg);
}
int add(int a, int b) {
return a + b;
}
main.c
#include "utils.h"
int main() {
print_message("Hello from main!");
int sum = add(5, 3);
printf("The sum is: %d\n", sum);
return 0;
}
编译命令:
你可以将所有源文件一次性编译成一个可执行文件:
gcc main.c utils.c -o my_program
GCC 会按顺序编译 main.c 和 utils.c,然后将它们链接成一个名为 my_program 的可执行文件。
生成共享库 (.so / .dll)
如果你想把一部分代码编译成库供其他程序使用,而不是直接生成可执行文件,可以使用 -shared 和 -fPIC 选项。
-fPIC(Position-Independent Code): 生成位置无关代码,这是创建共享库所必需的。-shared: 生成一个共享库(在 Linux/macOS 上是.so文件,在 Windows 上是.dll文件)。
# 将 utils.c 编译成共享库 gcc -fPIC -shared utils.c -o libutils.so
如何使用这个库?
编译 main.c 时,需要告诉链接器去哪里找这个库,以及库的名称。
-L.: 指定库的搜索路径为当前目录 ()。-lutils: 指定要链接的库名,链接器会自动在库名前加lib,后缀加上系统默认的库扩展名(如.so或.dll),-lutils实际上链接的是libutils.so。
# 编译 main.c 并链接 libutils.so gcc main.c -L. -lutils -o my_program_with_lib
总结与常用命令组合
| 功能 | 命令示例 | 说明 |
|---|---|---|
| 基本编译 | gcc hello.c -o hello |
最简单的编译和链接 |
| 开启警告 | gcc -Wall hello.c -o hello |
强烈推荐,帮助发现潜在问题 |
| 开启调试 | gcc -g hello.c -o hello |
生成带调试信息的可执行文件 |
| 优化代码 | gcc -O2 hello.c -o hello |
在性能和编译时间间平衡的优化 |
| 指定标准 | gcc -std=c99 -Wall hello.c -o hello |
使用 C99 标准 |
| 开发模式 | gcc -g -Wall -std=c99 hello.c -o hello |
最推荐的日常开发组合 |
| 多文件编译 | gcc main.c utils.c -o my_app |
一次性编译多个源文件 |
| 生成共享库 | gcc -fPIC -shared utils.c -o libutils.so |
创建可被其他程序链接的库 |
掌握这些命令和选项,你就可以应对绝大多数 C 语言的编译场景了,对于更复杂的项目,通常会使用 Make 或 CMake 等构建工具来自动化编译过程。
