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

您所在的位置:网站首页 斯菲尔电气怎么样 compile、link、build、run、debug的理解以及从.cpp到.exe的编译链接详解

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

2024-01-19 00:48| 来源: 网络整理| 查看: 265

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% 保证你的代码从语法上讲是正确的,因为哪怕有一点小小的错误,编译也不能通过,编译器会告诉你哪里错了,便于你的更改。

参考文章:

build, debug, compile and run深度解析程序从编译到运行C语言编译和链接详解


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3