> 技术文档 > 【Linux】深度学习GCC的编译流程

【Linux】深度学习GCC的编译流程


文章目录

    • GCC 编译流程:从源码到可执行文件
      • 1. 编译四阶段详解(以 `code.c` 为例)
      • 2. 关键补充:系统基础与开发关联
        • (1).iso 镜像文件
        • (2)Linux 用户权限与信任管理
      • 3. 条件编译:实现多版本功能裁剪
        • (1)核心原理:用宏定义控制编译范围
        • (2)编译不同版本的命令
        • (3)条件编译的价值
    • 为什么需要编译与汇编?——编程语言发展史
      • 1. 早期编程:低效的“二进制时代”
      • 2. 汇编语言:机器码的“助记符革命”
      • 3. 高级语言与编译器:脱离硬件的“人性化编程”
      • 4. 发展流程总结

GCC 编译流程:从源码到可执行文件

GCC(GNU Compiler Collection)是 C/C++ 等语言的主流编译器,编译过程分为 预处理、编译、汇编、链接 4 个阶段,每个阶段可通过参数单独控制,便于理解编译原理。

1. 编译四阶段详解(以 code.c 为例)

阶段 核心功能 GCC 命令 输出文件类型 文件作用 预处理 展开头文件、替换宏定义、删除注释 gcc -E code.c -o code.i .i 预处理后的源码(仍为文本) 编译 将预处理代码翻译成汇编语言(文本) gcc -S code.i -o code.s(或 gcc -S code.c.s 汇编语言代码 汇编 将汇编代码翻译成二进制目标文件 gcc -c code.s -o code.o(或 gcc -c code.c.o 二进制目标文件(不可执行) 链接 将目标文件与系统库/第三方库合并 gcc code.o -o myprog(或 gcc code.c -o myprog) 可执行文件 可直接运行的二进制程序
  • 编译阶段(生成汇编代码)参考:
    【Linux】深度学习GCC的编译流程
  • 链接阶段(合并目标文件与库)参考:
    【Linux】深度学习GCC的编译流程

2. 关键补充:系统基础与开发关联

(1).iso 镜像文件

.iso 是光盘镜像文件格式,Linux 系统(如 Ubuntu、CentOS)通常以 .iso 形式分发——开发工具(Vim、GCC)需基于 Linux 系统安装,因此 .iso 是搭建 Linux 开发环境的“系统安装包”,可通过虚拟机(如 VirtualBox)或 U 盘启动盘加载安装。
【Linux】深度学习GCC的编译流程

(2)Linux 用户权限与信任管理

开发中需注意用户权限,避免因权限不足导致工具无法使用或文件无法执行:

  • 用户提权:安装 Vim/GCC 时需管理员权限,终端输入 sudo apt install vim gcc(Ubuntu 系统),sudo 表示临时获取管理员权限;
  • 文件权限:编译生成的可执行文件若提示“Permission denied”,输入 chmod +x 文件名(如 chmod +x myprog)赋予运行权限;
  • 用户管理操作参考:
    【Linux】深度学习GCC的编译流程
    【Linux】深度学习GCC的编译流程
    【Linux】深度学习GCC的编译流程

3. 条件编译:实现多版本功能裁剪

条件编译通过 GCC 预处理指令(如 #if #ifdef #endif)控制源码编译范围,是开发“多版本软件”(免费版/专业版、社区版/企业版)的核心技术,解决“一份源码维护多个版本”的问题。

(1)核心原理:用宏定义控制编译范围

以“免费版 vs 专业版”为例,通过 #define PRO_VERSION 宏控制专业版功能是否编译:

#include // 1. 定义 PRO_VERSION 表示编译专业版(注释此行则编译免费版)#define PRO_VERSIONint main() { // 免费版基础功能(所有版本都编译) printf(\"免费版功能:基础文件编辑、代码保存\\n\"); // 2. 专业版专属功能(仅定义 PRO_VERSION 时编译) #ifdef PRO_VERSION printf(\"专业版功能:代码调试、多文件管理、云端同步\\n\"); #endif return 0;}
(2)编译不同版本的命令
  • 编译免费版:直接编译(不定义 PRO_VERSION
    gcc code.c -o free_version
    运行结果:仅显示“免费版功能”;
  • 编译专业版:通过 -D 参数强制定义 PRO_VERSION
    gcc -D PRO_VERSION code.c -o pro_version
    运行结果:同时显示“免费版+专业版功能”。
(3)条件编译的价值
  • 减少维护成本:无需为不同版本单独写源码,仅通过宏定义切换;
  • 减小文件体积:专业版功能不会编译到免费版中,避免冗余代码;
  • 跨平台适配:可通过 #ifdef __linux__ #ifdef _WIN32 等宏,让同一份源码在 Linux/Windows 上编译不同逻辑;
    【Linux】深度学习GCC的编译流程

为什么需要编译与汇编?——编程语言发展史

编译和汇编的诞生,本质是“降低编程门槛、提高开发效率”的历史必然,核心脉络从“二进制编程”逐步演进到“高级语言”。

1. 早期编程:低效的“二进制时代”

  • 核心方式:直接手写机器码(二进制 0/1),通过“纸带打孔”输入计算机(打孔=1,无孔=0);
  • 致命问题:
    • 效率极低:一个简单的加法操作(如 1+1)需对应一串二进制(如 00110001 00101011 00110001),记错一个 0/1 就会导致程序崩溃;
    • 可读性为 0:没人能直接看懂一串无意义的 0/1 序列,调试难度堪比“大海捞针”。

2. 汇编语言:机器码的“助记符革命”

  • 核心改进:用 助记符 替代二进制机器码(如 MOV 表示数据移动、ADD 表示加法),例如:
    • 二进制机器码:10110000 00000001
    • 对应汇编代码:MOV AX, 1(直观易懂,无需记忆二进制);
  • 工具需求:汇编代码仍需“翻译”成机器码才能被 CPU 执行,因此 汇编器(Assembler)诞生——这是第一个“程序翻译工具”;
  • 局限性:汇编语言与硬件强绑定(不同 CPU 指令集不同,x86 的汇编代码无法在 ARM 上运行),仍需理解硬件原理,编程门槛依然较高。

3. 高级语言与编译器:脱离硬件的“人性化编程”

  • 高级语言诞生:20 世纪 50 年代后,Fortran、C、Java 等高级语言出现,语法接近人类自然语言(如 if-else for 循环),且与硬件无关(同一代码可在不同 CPU 上运行);
  • 编译器的必要性:高级语言无法直接被 CPU 执行,需 编译器 将其翻译成汇编代码(或直接翻译成机器码);
  • 关键纠正:原“先有二进制编译器,再开发汇编语言编译器”为逻辑错误!正确发展顺序是:
    1. 机器码 手写第一个“汇编器”(翻译汇编代码→机器码);
    2. 汇编语言 编写第一个“高级语言编译器”(如用汇编写 C 编译器初代版本);
    3. 高级语言 重构编译器(如用 C 语言优化 C 编译器),形成“自举编译链”(Bootstrapping)。

4. 发展流程总结

graph LRA[二进制编程(纸带打孔)→ 效率极低] B[汇编语言 + 汇编器 → 助记符替代二进制]C[高级语言(C/Java) + 编译器 → 脱离硬件]D[自举编译 → 用高级语言优化编译器]A --> B --> C --> D
  • 编程语言发展历程参考:
    【Linux】深度学习GCC的编译流程

本质结论:编译和汇编是“编程语言进化的产物”——从直接操作硬件(二进制)到间接控制(高级语言),每一步都在降低门槛、提高效率,而编译器/汇编器就是连接“人类可读代码”与“机器可执行代码”的桥梁。

脉动广告联盟