compile、link、build、run、debug的理解以及从.cpp到.exe的编译链接详解

本文详细介绍了编译、链接、构建、运行和调试等编程术语的概念。编译是将源代码转换为机器指令,链接则是将编译后的文件与系统组件结合成可执行文件。构建涵盖了编译和链接,资源添加等过程。运行指执行可执行文件,而调试则是在运行时使用调试器检查程序行为。理解这些步骤对于程序员来说至关重要,因为每个源文件都需要经过编译和链接才能成为可执行的.exe文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

compile、link、build、run、debug的理解

在CSDN、知乎查了好多中文文章,都没有能让自己理解很透彻的文章,最终找到了这么一段解释,读起来比中文的更容易理解,所以不用畏惧英文,它并没有自己想象中的那么难以理解

Compile means to take a source code file and turn it into machine instructions, usually held in a .o or .obj file with a particular format.

Link means to take the compiled files (.o/.objs) needed and put them into an executable, thus “linking” all the function calls as needed from one .o/.obj to another.

Build means to compile everything necessary and link everything necessary into the executable or dll, and it additionally can mean to add in “resources” that may be needed in your program if for instance your program has a GUI.

Run could mean different things, but most likely means to do a build and then run it, without debugging it.

Debug means to do a build and then run it with the explicitly stated purpose of running it under the debugger.

.cpp->.exe
为什么要进行.cpp->.exe的转化?

我们知道,CPU能够直接识别并执行的指令是以二进制编码为表现形式的机器指令,所以在计算机发展的初期,程序员就是使用这样的二进制指令来编写程序的,那个拓荒的年代还没有编程语言。

但对于程序员而言,使用二进制指令来编写程序所面临的很大的困难就是步骤繁琐、效率低下,所以逐渐有了能够取代二进制指令的编程语言,如汇编、C语言、C++、Java、Python、Go语言等。由于CPU只能识别二进制指令,所以伴随着汇编语言出现的一定还有将汇编语言转化成二进制指令的软件,这样的软件就是编译器。

所以我们可以将编译器看做是程序员与CPU间实现交流的翻译官,程序员通过编写相对简单直观的汇编语言,编译器将汇编语言翻译成CPU能够识别的二进制指令,以此实现程序员与CPU间的交流,这样就很容易理解了。

.cpp->.exe是怎么转化的?

.exe文件是指双击后就可以直接运行的程序,也被称为可执行文件。在 Windows 下,可执行程序的后缀有 .exe 和 .com(其中 .exe 比较常见);在类 UNIX 系统(Linux、Mac OS 等)下,可执行程序没有特定的后缀,系统根据文件的头部信息来判断是否是可执行程序。

那么程序员编写的程序是如何转化为可执行文件的呢?以C++为例,程序员编写的.cpp文件需要经过编译链接两个过程最终转化为.exe文件,整个流程如下图所示。
请添加图片描述

编译器能够识别代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的二进制形式,这个过程称为编译(Compile)。

C语言代码经过编译以后,并没有生成最终的可执行文件(.exe 文件),而是生成了一种叫做目标文件(Object File)的中间文件(或者说临时文件)。目标文件也是二进制形式的,它和可执行文件的格式是一样的。对于 Visual C++,目标文件的后缀是.obj;对于GCC,目标文件的后缀是.o。

目标文件经过链接(Link)以后才能变成可执行文件。既然目标文件和可执行文件的格式是一样的,为什么还要再链接一次呢,直接作为可执行文件不行吗?

不行的!因为编译只是将我们自己写的代码变成了二进制形式,它还需要和系统组件(比如标准库、动态链接库等)结合起来,这些组件都是程序运行所必须的。

链接(Link)其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器(Linker)

随着我们学习的深入,我们编写的代码越来越多,最终需要将它们分散到多个源文件中,编译器每次只能编译一个源文件,生成一个目标文件,这个时候,链接器除了将目标文件和系统组件组合起来,还需要将编译器生成的多个目标文件组合起来。

再次强调,编译是针对一个源文件的,有多少个源文件就需要编译多少次,就会生成多少个目标文件。

总结:

不管我们编写的代码有多么简单,都必须经过「编译 --> 链接」的过程才能生成可执行文件:

  • 编译就是将我们编写的源代码“翻译”成计算机可以识别的二进制格式,它们以目标文件的形式存在;
  • 链接就是一个“打包”的过程,它将所有的目标文件以及系统组件组合成一个可执行文件。

如果不是特别强调,一般情况下我们所说的“编译器”实际上也包括了链接器,比如,你使用了哪种编译器?去哪里下载C语言编译器?我的编译器为什么报错了呢?

补充:

C语言的编译器有很多种,如**MSVC、GCC、Cygwin、MingW**等,不同的平台下有不同的编译器,例如:

  • Windows 下常用的是微软开发的 Visual C++,它被集成在 Visual Studio 中,一般不单独使用;
  • Linux 下常用的是 GUN 组织开发的GCC,很多 Linux 发行版都自带 GCC;
  • Mac 下常用的是 LLVM/Clang,它被集成在 Xcode 中(Xcode 以前集成的是 GCC,后来由于 GCC 的不配合才改为 LLVM/Clang,LLVM/Clang 的性能比 GCC 更加强大)。

你的代码语法正确与否,编译器说了才算,我们学习C语言,从某种意义上说就是学习如何使用编译器。编译器可以 100% 保证你的代码从语法上讲是正确的,因为哪怕有一点小小的错误,编译也不能通过,编译器会告诉你哪里错了,便于你的更改。

参考文章:

  1. build, debug, compile and run
  2. 深度解析程序从编译到运行
  3. C语言编译和链接详解
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值