代码示例:1.1.1 GCC 编译四阶段与常用选项
全部示例均标注编译命令、适用环境与实测状态;完整验证记录见《03.5-代码编译运行验证记录》。
examples/ex1-four-stages.c · 单文件四阶段演示(-E/-S/-c 分步产物)
/* ex1-four-stages.c —— 单文件四阶段演示(1.1.1) * 适用环境:Linux / Windows(MinGW) 标准:C11(纯标准,无 GNU 扩展) * 编译:gcc ex1-four-stages.c -o ex1 -std=c11 -Wall -Wextra -Wpedantic * 分阶段(见正文 ⑥,均已实测): * gcc -E ex1-four-stages.c -o ex1.i → 预处理产物(展开 stdio.h,通常上万行) * gcc -S ex1-four-stages.c -o ex1.s → 编译产物(汇编代码) * gcc -c ex1-four-stages.c -o ex1.o → 汇编产物(目标文件,含机器码与符号表) * gcc ex1.o -o ex1 → 链接产物(可执行文件) * 运行:Linux: ./ex1 Windows: ex1.exe */ #include <stdio.h> #define GREETING "Hello from four stages" static int add(int a, int b) { return a + b; } int main(void) { printf("%s\n", GREETING); printf("add(3, 4) = %d\n", add(3, 4)); return 0; }examples/ex2-main.c · 多文件链接(main.c 调用 util.c 的 square)
/* ex2-main.c —— 多文件链接演示(1.1.1):main 调用 ex2-util.c 中的 square * 适用环境:Linux / Windows(MinGW) 标准:C11 * 一起编译:gcc ex2-main.c ex2-util.c -o app -std=c11 -Wall -Wextra -Wpedantic * 分步编译(见正文 ⑥): * gcc -c ex2-main.c -o main.o -std=c11 -Wall -Wextra -Wpedantic * gcc -c ex2-util.c -o util.o -std=c11 -Wall -Wextra -Wpedantic * gcc main.o util.o -o app * 运行:Linux: ./app Windows: app.exe */ #include <stdio.h> int square(int x); /* 声明:实现位于 ex2-util.c,链接阶段才会用到它 */ int main(void) { int values[3] = {2, 5, 9}; int i; for (i = 0; i < 3; i++) { printf("square(%d) = %d\n", values[i], square(values[i])); } return 0; }examples/ex3-link-error.c · 链接错误演示(diagnostic)
/* ex3-link-error.c —— 演示"链接错误"(1.1.1,diagnostic) * 故意调用只有声明、没有实现的函数:编译阶段能通过,链接阶段报 undefined reference。 * 预期:gcc ex3-link-error.c -o ex3 -std=c11 -Wall -Wextra -Wpedantic 在链接阶段失败 * 验证编译阶段本身可通过:gcc -c ex3-link-error.c -o ex3.o -std=c11 -Wall -Wextra -Wpedantic */ extern int missing_func(void); /* 只有声明,全工程找不到实现 */ int main(void) { return missing_func(); }