跳到主要内容
🔍

代码示例: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();
    }