编译过程

编译过程是将高级编程语言(如 C 语言)写成的源代码转换成机器可以执行的低级机器语言(通常是二进制代码)的过程。这个过程一般可以分为几个阶段:

  1. 预处理(Preprocessing):

    • 预处理器指令,如 #include#define 和条件编译指令 #ifdef#endif 等被处理。
    • 头文件内容(包含在源文件中的 .h 文件)是插入到源代码中的。
    • 宏替换发生在这个阶段。
    • 预处理器还会去除注释,并扩展所有预处理指令。
  2. 编译(Compilation):
    • 预处理过的代码被编译器转换成汇编语言。
    • 编译器进行词法分析、语法分析、语义分析和中间代码生成。
    • 此外,编译器进行了优化的处理,消除不必要的代码,优化循环和减少空间和时间的消耗。
  3. 汇编(Assembly):
    • 汇编程序将汇编语言转换成机器语言,生成所谓的目标代码(通常是 .o.obj 文件)。
    • 汇编语言是一种低级语言,但它是使用符号编码而不是二进制。
  4. 链接(Linking):
    • 在链接阶段,一个或者多个目标代码文件被合并,并与库代码链接一起生成一个可执行文件。
    • 链接器解决程序中对库函数和其他模块的调用。
    • 如果程序中有多个文件,则需要将它们的目标代码与所需的库文件一起链接。

通常这四个步骤是自动进行的,程序员只需通过一个编译命令就能完成这个过程。例如,当你在 C 语言的开发环境中输入 gcc main.c -o main 并按下回车,上述所有步骤都由 gcc 编译器自动完成,并最终生成名为 main 的可执行文件。

详尽的编译过程可能会更加复杂,因为编译器优化可以包含许多不同的技术和优化阶段。同时,现代编译器可能在内部使用更多抽象表示形式来转换和优化代码,直到最后生成目标代码。

使用编译工具分步编译

要使用 cc 编译一个包含多个 C 文件的项目,你通常需要分两个步骤进行:编译和链接。下面是一个分步的基本示例,假设你有一个主源文件 main.c 和一个源文件 file.c,以及它依赖的头文件 file.h

  1. 分别编译每个源文件为目标文件:

    cc -c main.c
    cc -c file.c

    这里,-c 标志告诉 cc 编译器生成目标文件而不是完成整个链接过程。生成的目标文件为 main.ofile.o

  2. 将所有的目标文件链接成一个可执行文件:

    cc file.o main.o -o program

在这个命令中,所有的 .o 目标文件被链接起来以生成最终的可执行文件 program

如果你的项目比较复杂,包含许多源文件和依赖,手动管理这个过程可能变得很繁琐。在这种情况下,可以使用构建系统(如 make、CMake 或 Meson)来自动化编译和链接的过程。例如,你可以创建一个 Makefile 来简化操作:

# Makefile 示例
CC=cc # 定义编译器
CFLAGS=-c -Wall # 定义编译标志
LDFLAGS= # 定义链接标志,如需要可以添加 -lm 来链接数学库
SOURCES=main.c file.c # 定义源文件列表
OBJECTS=$(SOURCES:.c=.o) # 自动推导出目标文件列表
EXECUTABLE=program # 定义最终的可执行文件名 all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@ .c.o:
$(CC) $(CFLAGS) $< -o $@ clean:
rm -f $(OBJECTS) $(EXECUTABLE)

然后,只需在包含 Makefile 的目录中运行 make 命令,make 会自动处理编译和链接的整个过程。make clean 命令会清理所有生成的目标文件和可执行文件,这样你可以重新开始编译过程。这是一种更高级的自动化处理方式,它在大型项目中非常有用。

推荐阅读:C 编译过程与库文件的作用

C 语言编译过程的更多相关文章

  1. C语言编译过程及数据类型

    写在前面 C语言可以称得上是高级语言中的低级语言,接下来一段时间,我会写一下文章关于c语言,把它的神秘面纱一 一揭开.下面主要是c语言的C语言编译过程及数据类型 源文件编译过程 为了使计算机能执行高级 ...

  2. C语言编译过程以及gcc编译参数

    1.1       C语言编译过程,gcc参数简介 1.1.1          C语言编译过程 一.gcc - o a a.c -o:指定文件输出名字 二.C语言编译的过程: 1.1.1       ...

  3. 转 C语言编译过程简介

    C语言编译过程简介 C语言编译过程简介 刚开始接触编程的时候,只知道照书敲敲代码,一直都不知道为什么在windows平台下代码经过鼠标那样点击几下,程序的结果就会在那个黑色的屏幕上.现在找了个机会将C ...

  4. GCC 使用-C语言编译过程

    任何一种高级语言,要想在机器上执行,必须翻译为机器能读懂的机器语言.编译器就相当于翻译官,将高级语言翻译为机器语言. GCC 最初只用了编译 C 语言程序,全称是 GNU C Compiler.后来扩 ...

  5. Go 语言编译过程

    走进Golang之编译器原理_大愚Talk-CSDN博客 https://blog.csdn.net/hel12he/article/details/103061921 go编译器 - 知乎 http ...

  6. go语言编译过程概述

    go语言编译过程概述 总结自<go语言设计与实现> 名词解释: 中间代码 中间代码是编译器或者虚拟机使用的语言,它可以来帮助我们分析计算机程序.在编译过程中,编译器会在将源代码转换到机器码 ...

  7. C语言编译过程

    GCC编译C源码有四个步骤: 预处理-----> 编译 ----> 汇编 ----> 链接 一. 编译和链接的流程 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在 ...

  8. C语言编译过程详解

    前言 C语言程序从源代码到二进制行程序都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程. 编写hello world C程序: // hello.c #include ...

  9. C语言编译过程(转)

    内容摘要 : C语言编译的整个过程是非常复杂的,里面涉及到的编译器知识.硬件知识.工具链知识都是非常多的,深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的,希望大家可以多了解一些,在遇到问 ...

  10. C语言基础(21)-C语言编译过程及GCC参数简介

    任何C语言的编译过程可分为以下三部分: 一.预编译 在C语言中,以#开头的语句又叫预编译指令.预编译主要做以下两件事情: 1.将#include包含的头文件做简单的文本替换: 2.将代码中的注释删除. ...

随机推荐

  1. 复习 - es6语法

    这几天电脑有点问题,一直在弄,而且论文也逼近了也在时间弄那个 ,前面node有一个大项目,已经做完了,我现在是准备把上次复习断下的继续复习一直到这个项目,然后就开始vue了. 1. 首先是函数的一个进 ...

  2. vscode 使用 python 进行 UG 二次开发 实现代码提示功能

    vscode 使用 python 进行 UG 二次开发的 实现代码提示功能 用 VSCODE 进行 UG 二次开发的时候, 想要用代码提示的时候,可以用 pydev 插件, 但是,pydev 只有一个 ...

  3. GUI测试还能这么玩(Page Code Gen + Data Gen + Headless)

    标签(空格分隔): GUI测试还能这么玩(Page Code Gen + Data Gen + Headless) 页面对象自动生成 在前面的文章中,我已经介绍过页面对象(Page Object)模型 ...

  4. 委托之Action与Func

    1 例程代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  5. ECMA标准ECMAScript(JavaScript的一个标准)和C#

    2024 年 6 月 26 日,第 127 届 ECMA 大会正式批准了 ECMAScript 2024 语言规范,这意味着它现在正式成为最新 ECMAScript 标准.ECMAScript是ECM ...

  6. [oeasy]python0007-Guido的简历

    ​ 执行 esc 退回到正常模式 ​ 编辑 esc退出插入模式 准备底行命令模式运行当前py文件 保存执行 ​:w|!python3 %​ 保存并用 python3 解释当前程序(%) ​ 编辑 可以 ...

  7. 【Vue】动态方法调用

    JS的动态方法调用是通过eval函数实现 但是在Vue中是通过组件的$options.methods实现, 写这篇的随笔的原因是因为今天为了封装面包屑组件,花了一下午折腾这个动态方法调用 调用DEMO ...

  8. 【SQL】 牛客网SQL训练Part1 简单难度

    地址位置: https://www.nowcoder.com/exam/oj?difficulty=2 查找入职员工时间排名倒数第三的员工所有信息 -- 准备脚本 drop table if exis ...

  9. 【VMware】将NAT虚拟机开放访问

    NAT模式下面需要将主机内的虚拟机提供给外部访问 这个设置可以通过开启端口来实现外部访问NAT虚拟机 主机端口 - 映射 虚拟机 IP 的端口,问题是有多少个虚拟机应用就需要开多少个端口...

  10. 【Eclipse】下载安装(Windows)

    Eclipse的下载和安装 官网地址:https://www.eclipse.org/downloads/ 刚用的时候选了安装版,然后安装到一半就失败了 建议点下面的解压包下载,解压即用 注意看框线的 ...