更改网站名字,汽车之家官网首页网页版,域名解析错误连不上网,保定市网站制作目录一、了解编译二、认识编译的四个阶段#xff08;一#xff09;预处理#xff08;二#xff09;编译#xff08;三#xff09;汇编#xff08;四#xff09;链接1.静态链接2.动态链接三、分步编译#xff08;一#xff09;创建.c文件#xff08;二#xff09;预…
目录一、了解编译二、认识编译的四个阶段一预处理二编译三汇编四链接1.静态链接2.动态链接三、分步编译一创建.c文件二预处理三编译四汇编五链接六运行四、合并编译在Windows的IDE中编写代码时我们只需要点击按钮就可以完成程序的编译从而生成可执行文件。但在Linux中我们需要使用指令来进行程序的编译和运行因此也就需要来了解一下从代码到可执行文件会经历什么。我们这里以Linux中的gcc编译器为例。
一、了解编译 什么是编译 把我们敲的代码变成可执行文件。 什么是可执行文件 就是可以直接运行的程序文件。例如Windows中的.exe文件。 windows中如何编译 在windows中我们使用IDE进行程序的编译和运行时仅需要鼠标点击几下就可以完成 Linux中如何编译代码 在Linux中我们使用的gcc来编译C语言代码使用g来编译C代码这两个是不可以混用的。 我们都知道在程序写好后需要先进行编译只有编译通过了这个程序才可以尝试运行如果编译都不能通过谈何运行呢 而程序的编译大致分为四部分
预处理预编译编译汇编链接 以上这四个阶段就是一个程序在整个编译阶段会经历的四步操作接下来就让我们详细看一下这四步操作都在干什么。
二、认识编译的四个阶段
一预处理 假设此时我们写了一个名叫mian.c的程序。这是编译的第一阶段这个阶段会做什么
宏替换去注释引入头文件 什么是宏替换 宏替换将定义的宏直接用值替换掉 什么是去注释 去注释把文件中所写的注释去掉 什么是引入头文件 我们在编写代码的过程中不可避免地要使用库函数因此会包含对应的头文件头文件中存储的是库函数的函数声明。这一步就是把头文件中的包含的函数声明等内容复制到我们写的main.c程序中。这里需要注意头文件中放的都是函数的声明并不是定义函数的定义在库中。也就是说这里是把头文件中的函数声明搬进来了。 这个阶段执行完成后生成的文件本质还是一个C程序因为它只是引入了一些函数声明去掉了注释进行了宏的替换。所以这一步并不会发现我们程序的错误我们把这个新生成的文件称为 main.i 文件。
二编译 编译阶段编译器会对main.i文件做什么
语法语义纠错把mian.i文件转换成汇编代码文件 首先检查main.i文件中的语法语义有没有错有错自然就会报错了。如果没有错就会把我们的mian.i程序解释成汇编指令mian.s文件。 经过这个阶段mian.s文件就成为了汇编代码不再是C代码。
三汇编 汇编阶段会对main.s文件做什么
把汇编指令解释为二进制指令文件mian.o文件 这一步会将会汇编指令mian.s文件解释成二进制指令文件也就是电脑能够识别的指令文件。此时的main.o文件就是二进制文件。
四链接 链接阶段会对main.o文件做什么
链接库文件或相关文件生成可执行文件。 生成main.o是不够的此时的它还无法执行。因为我们在预处理阶段引入的仅仅是函数的声明但是光有声明没有定义这也运行不了啊。 因此在这个阶段会把main.o文件和存储函数定义的库文件进行链接让我们的程序运行函数时可以找到函数的实现。从而生成可执行程序main文件。 链接方式有两种静态链接和动态链接Linux中默认是动态链接。
1.静态链接 生成可执行程序时会把函数在库中的实现搬到我们的文件中这样所有的函数声明和函数定义都在可执行文件中了。
好处运行时不需要依赖库文件因为函数的定义和声明都被复制到我们的可执行文件中了。坏处因为我们把函数的定义复制到了可执行文件中因此生成的可执行程序比较庞大。如果多个程序使用了相同的库函数那么运行的时候内存中会存在大量冗余代码。
2.动态链接 如果我们的程序中调用了库函数A动态链接会把A函数定义在库文件中的位置记录下来保存到可执行文件中并不会把函数的具体的实现复制过来。 当可执行程序运行时动态库就会被加载到内存中当可执行文件需要用到哪个函数的话只需要根据记录在可执行文件中的位置去内存中的动态库寻找即可。
好处当多个程序都使用这个库的时候只需要加载一个到内存中即可。这样代码冗余更小。坏处运行程序时动态库必须存在不然去哪里找函数的实现。
三、分步编译
gcc -E main.c -o main.i将main.c文件预处理成main.i文件gcc -S main.i -o main.s将main.i文件编译为汇编文件main.sgcc -c main.s -o main.o将main.s文件经过汇编处理生成main.o文件gcc mian.o -o mian将main.o文件与库文件链接生成可执行文件main
一创建.c文件 注意这里的-o是指定生成的文件名称。 二预处理 gcc -E main.c -o main.i 三编译 gcc -S main.i -o main.s 四汇编 gcc -c main.s -o main.o 五链接 gcc mian.o -o mian 六运行 四、合并编译 按照上面的分步编译虽然可以达到我们的预期目标但是比较麻烦毕竟敲那么多指令也比较费事因此推荐采用下面这样的合并编译。
gcc -E main.c -o main.i将main.c文件处理到预处理阶段完毕gcc -S main.c -o main.s将main.c文件处理到编译阶段完毕gcc -c main.c -o main.o将main.c文件处理到汇编阶段完毕gcc mian.c -o mian将main.c文件处理到链接阶段完毕。 上面这些指令可以提高我们的效率因此通常直接使用第四条指令一步到位。