基础编译与输出
| 选项 | 说明 |
|---|
gcc -o myapp main.c | 指定输出可执行文件名为 myapp(默认为 a.out) |
gcc -c main.c | 只编译生成目标文件 main.o,不链接 |
gcc -E main.c | 仅预处理(展开宏、包含头文件),输出到 stdout |
gcc -S main.c | 编译到汇编代码(生成 main.s) |
警告与错误检查(强烈推荐!)
开启警告能提前发现潜在 bug:
gcc -Wall -Wextra -Werror main.c -o myapp
| 选项 | 说明 |
|---|
-Wall | 启用大部分常用警告(如未使用变量、格式不匹配) |
-Wextra | 启用额外警告(如函数参数未使用) |
-Werror | 将所有警告视为错误(CI/CD 中常用) |
-Wpedantic | 严格遵循 ISO C 标准,禁止 GCC 扩展 |
-Wshadow | 警告变量名遮蔽(如局部变量与全局同名) |
-Wconversion | 警告隐式类型转换(如 int → float) |
-Wunused | 警告未使用的变量、函数、参数 |
最佳实践:开发时始终使用 -Wall -Wextra。
优化选项
| 选项 | 说明 |
|---|
-O0 | 无优化(默认,便于调试)关闭优化(调试时必须,优化会打乱代码执行顺序,导致调试错位) |
-O1 / -O2 | 平衡速度与体积(发布版推荐 -O2) |
-O3 | 更激进优化(可能增大代码体积) |
-Os | 优化代码大小(适合嵌入式) |
-Ofast | -O3 + 忽略 IEEE 浮点标准(慎用) |
调试用 -O0 -g,发布用 -O2。
调试支持
| 选项 | 说明 |
|---|
-g | 生成调试信息(供 gdb 使用) |
-ggdb | 生成 GDB 专用增强调试信息 |
-fno-omit-frame-pointer | 保留帧指针,便于栈回溯 |
-g3 | 包含宏定义等额外调试信息 |
头文件与库路径
| 选项 | 说明 |
|---|
-I /path/to/include | 添加头文件搜索路径(如 -I ./include) |
-L /path/to/lib | 添加库文件搜索路径(如 -L ./lib) |
-lxxx | 链接库 libxxx.so 或 libxxx.a(如 -lpthread) |
-static | 静态链接所有库(生成独立可执行文件) |
-static-libgcc / -static-libstdc++ | 仅静态链接 GCC 运行时库 |
-shared | 生成共享库(.so 文件) |
-fPIC | 生成位置无关代码(用于共享库) |
示例:
gcc main.c -I ./include -L ./lib -lmylib -o app
运行时库路径(RPATH)
让程序运行时自动找到 .so 文件,避免设置 LD_LIBRARY_PATH:
gcc main.c -L ./lib -lmylib -Wl,-rpath='$ORIGIN/lib' -o app
$ORIGIN 表示可执行文件所在目录;-Wl,xxx 表示将 xxx 传递给链接器 ld。
标准与语言版本
| 选项 | 说明 |
|---|
-std=c90 / -ansi | 遵循 C89/C90 标准 |
-std=c99 | C99 标准(支持 // 注释、for(int i=0;...)) |
-std=c11 | C11 标准(支持 _Generic、_Thread_local) |
-std=c17 / -std=c18 | C17(C18)标准(当前主流) |
-std=gnu11 | C11 + GNU 扩展(默认模式) |
✅ 推荐:-std=c11 或 -std=c17。
安全与加固(生产环境推荐)
| 选项 | 作用 |
|---|
-fstack-protector-strong | 栈溢出保护 |
-D_FORTIFY_SOURCE=2 | 加强字符串/内存函数检查(需配合 -O1 以上) |
-Wformat-security | 警告不安全的 printf 格式 |
-pie -fPIE | 生成位置无关可执行文件(ASLR 支持) |
-Wl,<option> | 传递参数给链接器(如 -Wl,-rpath=/usr/local/lib 指定运行时库路径) |
-Wl,-z,relro,-z,now | 加强 GOT 表保护 |
安全编译示例:
gcc -std=c11 -O2 -Wall -Wextra \
-fstack-protector-strong -D_FORTIFY_SOURCE=2 \
-pie -fPIE -Wl,-z,relro,-z,now \
main.c -o secure_app
其他实用选项
| 选项 | 说明 |
|---|
-M / -MM | 生成头文件依赖(用于 Makefile) |
-v | 显示详细编译过程(查看调用了哪些工具) |
-time | 输出编译各阶段耗时(优化编译速度) |
-fsanitize=<type> | 内存检测(如 -fsanitize=address 检测内存越界、泄漏,调试用) |
-save-temps | 保留中间文件(.i, .s, .o) |
-dumpversion | 仅输出 GCC 版本号 |
-pthread | 正确链接 POSIX 线程,支持多线程(比 -lpthread 更全面) |
多线程程序请用 -pthread,而非 -lpthread!
预处理选项
| 选项 | 说明 |
|---|
-D name | 定义宏, 如 -D DEBUG |
-D name=value | 定义带值宏, 如 -D VERSION=1 |
-U name | 取消定义宏, 如 -U DEBUG |
示例
// test.c
#include <stdio.h>
int main() {
#ifdef DEBUG
printf("调试模式开启\n");
#endif
printf("Hello\n");
return 0;
}
gcc test.c -o test -DDEBUG # 运行会输出"调试模式开启"
gcc test.c -o test # 不定义宏,仅输出"Hello"
完整示例:生产级编译命令
gcc -std=c11 \
-O2 \
-Wall -Wextra -Werror \
-fstack-protector-strong \
-D_FORTIFY_SOURCE=2 \
-I ./include \
-L ./lib \
-Wl,-rpath='$ORIGIN/lib' \
-pthread \
main.c utils.c \
-lconfig -lcjson \
-o myapp
常用示例
# 基本编译
gcc -o program main.c
# 开发调试
gcc main.c -o main -g3 -O0 -Wall -Wextra -fsanitize=address
# 编译多个文件
gcc -o program main.c utils.c helper.c
# 带优化和警告
gcc -Wall -Wextra -O2 -o program main.c
# 调试版本
gcc -g -Wall -O0 -o program_debug main.c
# 发布版本
gcc -Wall -O2 -DNDEBUG -o program_release main.c
# 链接数学库
gcc -o math_prog math.c -lm
# 指定C标准
gcc -std=c11 -o program main.c
# 创建共享库(动态库)
gcc -shared -fPIC -o libmylib.so mylib.c
# 静态链接
gcc -static -o program main.c
常用组合
| 场景 | 推荐选项 |
|---|
| 日常开发 | gcc -g -Wall -Wextra -std=c11 -o app main.c |
| 发布版本 | gcc -O2 -std=c11 -DNDEBUG -fstack-protector-strong -o app main.c |
| 调试崩溃 | gcc -g -O0 -fno-omit-frame-pointer -o app main.c |
| 嵌入式/小体积 | gcc -Os -s -ffunction-sections -Wl,--gc-sections -o app main.c |
Makefile 示例
# Makefile 示例
CC = gcc
CFLAGS = -Wall -Wextra -O2 -std=c11
LDFLAGS = -lm
TARGET = myprogram
SOURCES = main.c utils.c
OBJECTS = $(SOURCES:.c=.o)
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(TARGET) $(OBJECTS)
调试和优化技巧
# 查看编译过程
gcc -v -o program main.c 2>&1 | less
# 生成汇编代码
gcc -S -masm=intel -O2 main.c
# 分析二进制文件
file program
size program
objdump -d program # 反汇编
readelf -a program # ELF文件信息
# 性能分析准备
gcc -pg -O2 -o program main.c # 支持gprof
安全编译选项
# 安全编译建议
gcc -Wall -Wextra -Werror \
-O2 \
-D_FORTIFY_SOURCE=2 \
-fstack-protector-strong \
-Wformat -Wformat-security \
-Wl,-z,now -Wl,-z,relro \
-o program main.c