精华内容
下载资源
问答
  • C语言编译链接

    2017-09-19 23:25:09
    编译链接 源代码==》预处理==》编译==》汇编==》链接==》可执行文件 纯c语言 (检查) .obj .exe 注:预处理不存在语法检查 编译阶段会有语法检查 一, 预处理: (1)将所有的#define删除,并展开所有的宏...

    编译链接
    源代码==》预处理==》编译==》汇编==》链接==》可执行文件
    纯c语言 (检查) .obj .exe
    注:预处理不存在语法检查 编译阶段会有语法检查
    一, 预处理:
    (1)将所有的#define删除,并展开所有的宏定义
    (2)处理所有的条件预编译指令,如:#if #ifdef #elif #else#endif
    (3)处理#include预编译指令,将被包含的文件插进到该指令的位置,这个过程是递归的
    (4)删除所有的注释//与/* */
    (5)添加行号与文件名标识,以便产生调试用的行号信息以及编译错误或警告时能够显示行号
    (6)保留所有的#pragma编译器指令,因为编译器需要使用它们
    二,编译阶段:
    把预处理完的文件进行一系列词法分析(lex)、语法分析(yacc)、语义分析及优化后生成汇编代码,这个过程是程序构建的核心部分。
    三,链接:
    这里讲的链接,严格说应该叫静态链接。多个目标文件、库->最终的可执行文件(拼合的过程)。
    四,符号(Symbol) – 链接的接口:
    每个函数或变量都有自己独特的名字,才能避免链接过程中不同变量和函数之间的混淆。
    在链接中,我们将函数和变量统称为符号,函数名或变量名就是符号名,函数或变量的地址就是符号值。
    每一个目标文件都有一个符号表,符号有以下几种:
    (1) 定义在本目标文件的全局符号,可被其他目标文件引用
    (2) 在本目标文件中引用的全局符号,却没有定义在本目标文件 – 外部符号(External Symbol)
    (3) 段名,这种符号由编译器产生,其值为该段的起始地址
    (4) 局部符号,内部可见
    链接过程中,比较关心的是上面的第一类与第二类。
    注::C中的符号只有函数名 C++符号包含函数名和参数类型

    展开全文
  • C语言 编译 链接 过程

    2014-09-28 21:58:31
    其实,C语言编译器在对源代码编译之前,还需要进一步的处理:预编译。预编译的主要作用如下: ●将源文件中以”include”格式包含的文件复制到编译的源文件中。 ●用实际值替换用“#define”定义的字符串。 ●...
    1.1.预处理的功能
     
        在集成开发环境中,编译,链接是同时完成的。其实,C语言编译器在对源代码编译之前,还需要进一步的处理:预编译。预编译的主要作用如下:
    ●将源文件中以”include”格式包含的文件复制到编译的源文件中。
    ●用实际值替换用“#define”定义的字符串。

    ●根据“#if”后面的条件决定需要编译的代码。


    预处理的行为是由指令控制的。这些指令是由#字符开头的一些命令。
    #define指令定义了一个宏---用来代表其他东西的一个命令,通常是某一个类型的常量。预处理会通过将宏的名字和它的定义存储在一起来响应#define指令。当这个宏在后面的程序中使用到时,预处理器”扩展”了宏,将宏替换为它所定义的值。
    #include指令告诉预处理器打开一个特定的文件,将它的内容作为正在编译的文件的一部分“包含”进来。例如:下面这行命令:
    #include<stdio.h>

    指示预处理器打开一个名字为stdio.h的文件,并将它的内容加到当前的程序中。
    预处理器的输入是一个C语言程序,程序可能包含指令。预处理器会执行这些指令,并在处理过程中删除这些指令。预处理器的输出是另外一个程序:原程序的一个编辑后的版本,不再包含指令。预处理器的输出被直接交给编译器,编译器检查程序是否有错误,并经程序翻译为目标代码。


    第二个阶段编译、优化阶段编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。 

    链接器主要是将有关的目标文件彼此相连接生成可加载、可执行的目标文件。链接器的核心工作就是符号表解析和重定位。


    C语言是大部分编程初学者接触的第一种语言,也许很多Cer对C的熟练已经到了炉火纯青的地步,但是当涉及到编译和链接的问题很多人却不以为然,毕竟我们在任何IDE下除了code以外对编译链接的理解就是一到两个按钮而已,但是通过阅读以下的内容,你会发现C语言本身的许多语法特性与其独到的编译连接方式是息息相关的。
         (以下内容为网上内容,由帖主整理)

         首先是预编译,这一步可以粗略的认为只做了一件事情,那就是“宏展开”,也就是对那些#***的命令的一种展开,例如define MAX 1000就是建立起MAX和1000之间的对等关系,好在编译阶段进行替换;例如ifdef/ifndef就是从一个文件中有选择性的挑出一些符合条件的代码来交给下一步的编译阶段来处理;这里面最复杂的莫过于include了,其实也很简单,就是相当于把那个对应的文件里面的内容一下子替换到这条include***语句的地方来。

         其次是编译,这一步很重要,编译是以一个个独立的文件作为单元的,一个文件就会编译出一个目标文件。(这里插入一点关于编译的文件的说明,编译器通过后缀名来辨识是否编译该文件,因此“.h”的头文件一概不理会,而“.cpp”的源文件一律都要被编译,我实验过把.h文件的后缀名改为.cpp,然后在include的地方相应的改为***.cpp,这样一来,编译器就会编译许多不必要的头文件,只不过头文件里我们通常只放置声明而不是定义,因此最后链接生成的可执行文件的大小是不会改变的)清楚编译是以一个个单独的文件为单元的,这一点很重要,因此编译只负责本单元的那些事,而对外部的事情一概不理会,在这一步里,我们可以调用一个函数而不必给出这个函数的定义,但是要在调用前得到这个函数的声明(其实这就是include的本质,不就是为了给你提前提供个声明而好让你使用吗?至于那个函数到底是如何实现的,需要在链接这一步里去找函数的入口地址。因此提供声明的方式可以是用include把放在别的文件中的声明拿过来,也可以是在调用之前自己写一句void max(int,int);都行。),编译阶段剩下的事情就是分析语法的正确性之类的工作了。好啦,总结一下,可以粗略的认为编译阶段分两步:

    第一步,检验函数或者变量是否存在它们的声明;

    第二步,检查语句是否符合C++语法

        最后一步是链接,它会把所有编译好的单元全部链接为一个整体文件,其实这一步可以比作一个“连线”的过程,比如A文件用了B文件中的函数,那么链接的这一步会建立起这个关联。链接时最重要的我认为是检查全局空间里面是不是有重复定义或者缺失定义。这也就解释了为什么我们一般不在头文件中出现定义,因为头文件有可能被释放到多个源文件中,每个源文件都会单独编译,链接时就会发现全局空间中有多个定义了。
    这里提到了全局的概念,
    编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。

    C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件
    http://blog.sina.com.cn/s/blog_a128f8cf010152nb.html

    编辑就是自己写代码,编译就是将你写的代码翻译成目标文件,连接是将你的目标文件与系统文件(资源、模块等)组合生成可执行文件。通过这三步完成程序的设计,当然后两步不是你的任务

    展开全文
  • C语言编译链接加载过程

    千次阅读 2015-03-22 14:15:58
    要把一个c程序变成一个可以在硬件上运行的程序(可执行程序),需要编译链接。编译就是将文本形式的源代码(高级语言写的代码)翻译成机器语言形式的目标文件的过程。链接就是将目标文件(可以是多个)、操作系统...

    要把一个c程序变成一个可以在硬件上运行的程序(可执行程序),需要编译链接。编译就是将文本形式的源代码(高级语言写的代码)翻译成机器语言形式的目标文件的过程。链接就是将目标文件(可以是多个)、操作系统启动代码和用到的库文件进行组织形成最终可加载可执行的代码的过程。

    过程图解如下: 

    1. 预处理器:将.c 文件转化成 .i文件,使用的gcc命令是:gcc –E,对应于预处理命令cpp;
    2. 编译器:将.c/.h文件转换成.s文件,使用的gcc命令是:gcc –S,对应于编译命令 cc –S;
    3. 汇编器:将.s 文件转化成 .o文件,使用的gcc 命令是:gcc –c,对应于汇编命令是 as;
    4. 链接器:将.o文件转化成可执行程序,使用的gcc 命令是: gcc,对应于链接命令是 ld;
    5. 加载器:将可执行程序加载到内存并进行执行,loader和ld-linux.so。

    其中,目标文件的组成如下图所示:



    其中
    • .bss:未初始化的全局C变量。在目标文件中这个节不占据实际的空间,它仅仅是一个占位符。目标文件格式区分初始化未初始化变量是为了空间效率在:在目标文件中,未初始化变量不需要占据任何实际的磁盘空间。

    链接:

    可执行程序是由各个目标文件经过连接而成。其主体部分依然是代码段、只读数据段和读写数据段,这三个段由各个目标文件(.o)经过“组合”而成。C语言目标文件到可执行程序的连接如下图所示。


    加载:加载器把可执行文件从外存加载到内存并进行执行。 Linux中进程运行时的内存映像如下:

     

     加载过程如下:

    加载器首先创建如上图所示的内存映像,然后根据段头部表,把目标文件拷贝到内存的数据和代码段中。然后,加载器跳转到程序入口点(即符号_start 的地址),执行启动代码(startup code),启动代码的调用顺序如所示:


    展开全文
  • C语言编译链接

    2016-04-16 17:22:00
    程序由源文件到可执行文件,一般经过预处理(Prepressing)、编译(Compilation)、汇编(Assembly)和链接(Linking)这四个阶段。如下图表示预处理预处理过程主要处理那些源代码文件只能够的以”#”开始的预编译...

    程序由源文件到可执行文件,一般经过预处理(Prepressing)、编译(Compilation)、汇编(Assembly)和链接(Linking)这四个阶段。如下图表示

    这里写图片描述

    预处理

    预处理过程主要处理那些源代码文件只能够的以”#”开始的预编译指令。比如“#include”、“#define”等,主要处理规则如下:
    (1)将所有的“#define“删除,并且展开所有的宏定义;
    (2)处理所有条件预编译指令,比如”#if“、”#ifdef“、”#elif“、”#else“、#endif;
    (3)处理”#include“预编译指令,将被包含的文件插入到该预编译指令的位置。注意:这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件;
    (4)删除所有的注释”//“和”、”/**/“;
    (5)添加行号和文件名标识,比如#2 “test.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号;
    (6)保留所有的#pragma编译器指令,因为编译器需要使用它们;

    编译

    编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析以及优化,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码,这个过程往往是我们所说的整个程序的构建的核心部分,也是最复杂的部分之一。

    汇编

    汇编实际上指汇编器(as)把汇编语言代码翻译成目标机器指令的过程。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。目标文件由段组成。通常一个目标文件中至少有两个段:

    代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。
    数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。

    链接

    由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。

      例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。

      链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。

     我们在linux使用的gcc编译器便是把以上的几个过程进行捆绑,使用户只使用一次命令就把编译工作完成,这的确方便了编译工作,但对于初学者了解编译过程就很不利了,下图便是gcc代理的编译过程:
     这里写图片描述

    参考自:
    1.第二章——编译和链接
    2.C 编译、链接、加载
    3.C语言的编译链接过程的介绍


    展开全文
  • C语言编译链接

    2014-11-07 01:25:15
    C语言编译链接 由C语言编写的系统项目,往往按照功能将系统的各个实现模块切分到不到的C源文件中,甚至将相关功能的一组文件收集到同一个文件夹中。要想在C程序编译成最终的一个可执行01文件,就要将这些C文件...
  • 我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令。让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。 预处理, 展开头文件/宏...
  • C语言编译

    2018-05-05 08:35:30
    这一篇文章我们来聊一聊C语言编译过程,就是从 .c 文件到 .exe 文件的过程。关于C语言编译过程,对很多人来说都感到特别苦涩,但是理解了这个过程对大家以后的能力上的提升是很有帮助的,在这里我会努力用最浅显...
  • C语言编译链接和加载

    千次阅读 2014-07-18 16:51:32
    C语言编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作...
  • c语言编译链接过程

    2012-09-06 09:58:34
    c语言编译链接过程:把c程序(源代码)转换成可以在机器上运行的程序(可执行代码)。需要进行编译和链接的过程。 编译:把c程序(源代码)转换成机器语言形式的目标文件  1 编译:主要包含两个过程  1 ...
  • C语言编译过程

    千次阅读 2018-04-01 12:14:06
    C语言编译过程为:预处理--&gt;编译--&gt;汇编--&gt;链接1、预处理(Pre-processing) 对源程序中的伪指令(以#开头的指令)和特殊符号进行处理。伪指令包括:宏定义指令、条件编译指令、头文件包含...
  • c语言编译链接的整个过程

    千次阅读 2016-10-19 13:33:34
    C语言编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的...
  • C语言编译链接过程详解

    千次阅读 2018-08-04 11:43:31
    我们将对C语言的这种处理过程称为编译链接编译就是把文本形式源代码翻译为机器语言形式的目标文件过程。 链接是把目标文件、操作系统的启动代码和用到的库文件进行组织最终形成可执行代码的过程。编译链接...
  • C语言编译预处理

    千次阅读 2019-08-05 08:18:43
    C语言由源代码生成可执行程序的过程如下... 其中编译预处理阶段,读取C源程序,对其中的预处理指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。 ...
  • C语言编译链接过程

    2013-09-15 15:46:09
    C语言编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的...
  • C语言编译链接执行过程

    千次阅读 2018-10-31 11:01:47
    C语言编译链接执行过程 ​ 机器不能识别高级语言,而对我们来说高级语言更方便理解,这需要编译器的帮助才能完成中间的转化过程:将高级语言转化成机器能识别的二进制文件。 ​ 而一个C程序在执行过程中,需要经历...
  • C语言编译执行过程

    千次阅读 2019-09-27 10:14:57
    C语言编译器的功能就是将源文件,经过编译链接之后可以形成可执行文件 那么具体的步骤是什么呢? C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-...
  • C语言编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的...
  • C语言编译过程详解

    千次阅读 2019-06-20 14:52:48
    IDE的使用让很多和我一样的人对C/C++可执行程序的底层生成一知半解,不利于我们深入理解原理。在这里小结一下,望路过的...C语言编译过程分成四个步骤: 1,由.c文件到.i文件,这个过程叫预处理 2,由.i文件到.s文件...
  • c语言编译过程

    2014-04-06 13:20:53
    C语言编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作...
  • 上一节,我们研究了如何在语法上解析结构体,这一节,我们在语法分析的基础上,实现结构体符号表和类型系统的代码,我们要解析的结构体定义如下:struct tag { int *a, b; long c; sturct tag *d; }name;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,748
精华内容 18,699
热门标签
关键字:

c语言编译链接符号表

c语言 订阅