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

文章目录

    • [GCC 编译流程:从源码到可执行文件](#GCC 编译流程:从源码到可执行文件)
    • 为什么需要编译与汇编?------编程语言发展史
      • [1. 早期编程:低效的"二进制时代"](#1. 早期编程:低效的“二进制时代”)
      • [2. 汇编语言:机器码的"助记符革命"](#2. 汇编语言:机器码的“助记符革命”)
      • [3. 高级语言与编译器:脱离硬件的"人性化编程"](#3. 高级语言与编译器:脱离硬件的“人性化编程”)
      • [4. 发展流程总结](#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 可执行文件 可直接运行的二进制程序
  • 编译阶段(生成汇编代码)参考:
  • 链接阶段(合并目标文件与库)参考:

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

(1).iso 镜像文件

.iso 是光盘镜像文件格式,Linux 系统(如 Ubuntu、CentOS)通常以 .iso 形式分发------开发工具(Vim、GCC)需基于 Linux 系统安装,因此 .iso 是搭建 Linux 开发环境的"系统安装包",可通过虚拟机(如 VirtualBox)或 U 盘启动盘加载安装。

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

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

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


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

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

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

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

c 复制代码
#include <stdio.h>

// 1. 定义 PRO_VERSION 表示编译专业版(注释此行则编译免费版)
#define PRO_VERSION

int 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 上编译不同逻辑;

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

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

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 LR A[二进制编程(纸带打孔)→ 效率极低] B[汇编语言 + 汇编器 → 助记符替代二进制] C[高级语言(C/Java) + 编译器 → 脱离硬件] D[自举编译 → 用高级语言优化编译器] A --> B --> C --> D
  • 编程语言发展历程参考:

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

相关推荐
東雪蓮☆几秒前
深入理解 iptables:Linux 防火墙从入门到精通
linux·运维·网络
努力学习的小廉20 分钟前
深入了解linux系统—— 线程互斥
linux·运维·服务器
zzz1006627 分钟前
CentOS 7 服务器初始化:从 0 到 1 的安全高效配置指南
服务器·安全·centos
会说话的吹风机37 分钟前
五、VSCODE SSH连接linux服务器免密登录
服务器·vscode·ssh
JioJio~z1 小时前
PLC通讯中遇到的实际场景
运维·服务器·网络
青衫客361 小时前
负载均衡之带权重的随机负载均衡算法详解与实现
运维·服务器·负载均衡
小米里的大麦2 小时前
034 进程间通信 —— System V 共享内存
linux
zgc12453672 小时前
Linux学习-网络编程2
linux·网络·学习
专注VB编程开发20年2 小时前
.NET组件读取压缩包中的内存数据电子表格XLSX文件和图片,不需要解压
linux·服务器·windows·c#·.net·excel·zip
御龙冀人2 小时前
解决VSCode无法下载服务器端 Server问的题
服务器·vscode·ssh