转载请标明;

编译链接是使用高级语言编程所必须的操作,一个源程序只有经过编译、链接操作以后才可以变成计算机可以理解并执行的二进制可执行文件。

编译是指根据用户写的源程序代码,经过词法和语法分析,将高级语言编写的代码转变为功能有效的汇编代码。

编译过程如下:

1、  预编译过程

在c语言的预编译过程中,主要是对宏定义、条件编译语句、头文件包含语句以及特殊符号进行处理。

对于宏定义语句,比如#define NAME “user”,则在预编译阶段,会将程序中所有的NAME都替换为usr,当前有一点值得注意的是字符串中的NAME是不会被替换的。而#define语句在经过预编译后的代码中则不会出现。宏定义中还有一个#undef,对于它的处理是从取消的位置开始,后面的代码中都不会进行替换了,同样的经过预编译后的代码不会有#undef语句了。

对于条件编译语句指的是#ifdef、#else、#ifndef、#elif、#endif、(注意还有#if)。条件编译指的是——如果#ifdef debug,如果定义了debug,那么后面部分的代码就会被编译,否则编译#else后的代码。对于条件编译语句,在预编译阶段处理它,是根据它过滤掉那些不必要的代码。

头文件包含指令,之所以有头文件是为了是某些定义可以让更多的c源程序使用。在预编译的过程中,预编译程序会将头文件中所有的定义都添加到它的输出文件中去,而不再有头文件包含指令。

2、  编译的过程

经过预编译以后,将产生新的源程序。编译程序将通过词法分析和语法分析,确认所有的指令都符合语法规则,并将其翻译成等价的中间代码或汇编代码。

3、  优化及汇编过程

将汇编代码翻译成机器指令——即生成计算机系统可识别的二进制代码。汇编的过程实际上就是将汇编语言代码翻译成为机器语言的过程。这时候生成的代码实际上并不能直接运行,要经过链接以后才可以运行。

链接过程如下:

所谓链接的过程就是指,经过编译后将会生成一个目标文件,这个目标文件可能会调用printf等函数,对于printf函数,它的目标代码在系统的函数库中(一般用户用到的很多函数库都存在于/usr/lib或者/lib中),链接所要做的就是将这些函数库中相应的代码组合到目标文件中去。

链接分为:

静态链接;就是把函数库中包含的目标代码静态添加到可执行文件中。一般静态链接生成的文件比较大。可独立运行。

动态链接;将这些函数库的路径、函数名等信息添加到可执行文件中去,在执行过程中动态加载函数库。需要函数库的支持。

C语言编译链接的更多相关文章

  1. 转:C语言的编译链接过程的介绍

    11:42:30 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接 ...

  2. C语言编译和链接

    编译链接是使用高级语言编程所必须的操作,一个源程序只有经过编译.链接操作以后才可以变成计算机可以理解并执行的二进制可执行文件. 编译是指根据用户写的源程序代码,经过词法和语法分析,将高级语言编写的代码 ...

  3. C语言程序经过编译链接后形成二进制映像文件的组成

    C语言程序经过编译链接后形成二进制映像文件由栈,堆,数据段,代码段组成,其中数据段又分为:只读数据段,已经初始化读写数据段,未初始化数据段(BSS段).如下图所示: 1.栈区(stack):由编译器自 ...

  4. C语言编译和链接详解(通俗易懂,深入本质)

    我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为可执行程序(Executable Program).在 Windows 下,可执行程序的后缀有.exe和.com(其中.exe比较常 ...

  5. C语言预处理编译链接各个阶段错误,分阶段的说一下

    C语言预处理编译链接各个阶段错误,分阶段的说一下 C语言预处理编译链接各个阶段错误,分阶段的说一下比如指针异常,数组下标越界什么的    我来答 1个回答 #热议# 你觉得这辈子有希望看到996消失 ...

  6. C++开始前篇,深入编译链接(3)

    一,COMMON块 什么是COMMON块,这是一种机制,早期的Fortran没有动态分配空间的机制,程序员必须事先声明它所需要的临时使用空间的大小.Fortran把这种空间叫做COMMON块,当不同的 ...

  7. C++开始前篇,深入编译链接(补充1)

    针对这些问题,这次做一个补充: 一,可重定位文件的格式是什么,以main.o为例, 格式为ELF ,包括:{1,ELF Header 它描述了整个文件的文件属性,包括文件是否可以执行,是静态链接还是动 ...

  8. C++开始前篇,深入编译链接

    C++开始,为什么要写这个东西,因为按照课堂进度的话,现在的C++已经学到模板以及重载了,有时却仍然因为一些小问题无法解答,原因是忘记了开始时学到的知识,深知不能像猴子掰棒子一样,掰一个扔一个,因此, ...

  9. C语言编译过程

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

随机推荐

  1. XML标签

    SQL标签库提供了创建和操作XML文档的标签. 引入语法:<%@ taglib prefix="x" uri="http://java.sun.com/jsp/js ...

  2. Dynamics AX 2012 R2 将系统用户账号连接到工作人员记录

    要使用AX中的一些特性,需要将User Account和他们的Employee Record连接在一起.最好将所有Employee的User Account,都和他们的Employee Record连 ...

  3. 本地yum库制作及本地安装Docker

    生产环境中,我们总是会遇到服务器无法连接外网的情况,这样,如果想安装某个应用,而这个应用依赖的其他类库又特别多,就很痛苦了.这个时候,就需要自己制作个本地的yum库,进行本地安装.本文将以Docker ...

  4. CentOS7安装memcached

    三台linux服务器系统CentOS7 一台memcached IP:192.168.155.134 一台Apache IP:192.168.155.130 一台nginx IP:192.168.15 ...

  5. JavaScript DOM 编程艺术(第2版)读书笔记 (9)

    三位一体的网页 结构层:由HTML或XHTML之类的标记语言负责创建: 表示层:由CSS负责完成: 行为层:负责内容应该如何响应事件这一问题.这是由JavaScript语言和DOM主宰的领域. 分离 ...

  6. Spring中的事物管理,基于spring的bean的配置

    很多东西与上边的相同,这儿只简介: 导包... 数据库中建立三个表... 建立存放连接数据库的file文件:jdbc.properties: ----------------------------- ...

  7. JS闭包导致循环给按钮添加事件时总是执行最后一个

    加入如下脚本代码: <script> var list_obj = document.getElementsByTagName('li'); for (var i = 0; i <= ...

  8. [问题2014A07] 解答

    [问题2014A07]  解答 我们分三步进行证明. \(1^\circ\) 先证 \(\alpha_1,\alpha_2\) 线性无关. 用反证法, 设 \(\alpha_1,\alpha_2\) ...

  9. Sprint(第三天11.16)

    Sprint1第一阶段 1.类名:软件工程-第一阶段 2.时间:11.14-11.23 3.选题内容:点餐系统 4.团队博客地址:http://www.cnblogs.com/iamCarson/ 团 ...

  10. hdu3847Trash Removal(凸包)

    链接 这题居然是WF的题, 应属于签到题.. 求一个多边形是否能被一个宽为d的矩形框住. 可以求一下凸包,然后枚举每条凸包的边,找出距离最远的点. #include <iostream> ...