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

    2020-03-14 10:10:22
    c语言的编译和链接 预编译 首先是预先处理头文件,把头文件的函数都输入到输出文件中,所以在这个输出文件中将不再有包含头文件的指令,这个头文件并不是值我们最终的这个头文件,而是经过预处理以后输出的头文件 ...

    本文参考https://www.cnblogs.com/zzdbullet/p/9911226.html

    c语言的编译和链接

    预编译

    • 首先是预先处理头文件,把头文件的函数都输入到输出文件中,所以在这个输出文件中将不再有包含头文件的指令,这个头文件并不是值我们最终的这个头文件,而是经过预处理以后输出的头文件
    • 其次是处理一些宏定义,对于宏定义语句,比如#define NAME “user”,则在预编译阶段,会将程序中所有的NAME都替换为usr,当前有一点值得注意的是字符串中的NAME是不会被替换的。而#define语句在经过预编译后的代码中则不会出现。宏定义中还有一个#undef,对于它的处理是从取消的位置开始,后面的代码中都不会进行替换了,同样的经过预编译后的代码不会有#undef语句了。
    • 对于条件编译语句指的是#ifdef、#else、#ifndef、#elif、#endif、(注意还有#if)。条件编译指的是——如果#ifdef debug,如果定义了debug,那么后面部分的代码就会被编译,否则编译#else后的代码。对于条件编译语句,在预编译阶段处理它,是根据它过滤掉那些不必要的代码。

    编译

    • 在编译之后将生成新的源文件,也就是我上面说的预编译生成的输出文件,进行词法分析和语法分析,在经过编译之后的文件会变成中间代码或者汇编文件

    汇编

    • 汇编就是对编译生成的汇编代码转换成机器代码。这个时候已经基本成型,但是并不能运行,因为还需要链接

    链接

    • 链接就是把上面的机器代码和系统中的函数库进行链接,比如_print , _scanf 函数,链接之后程序才能被执行
    • 链接还分为静态链接和动态链接
      • 静态链接,就是直接把系统中的函数一次性写入输出文件
      • 动态链接,是用到的时候在进行链接

    在这里插入图片描述

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

    2019-09-19 23:30:33
    该文章是对《程序员的自我修养》中第二章编译和链接的个人理解和总结,捎带有一些扩展。对于要把代码执行起来,本文的知识就足够了。 一个C语言的文件编译成二进制的可执行文件会经历这样几个过程: 预编译:将...

    该文章是对《程序员的自我修养》中第二章编译和链接的个人理解和总结,捎带有一些扩展。对于要把代码执行起来,本文的知识就足够了。

    一个C语言的文件编译成二进制的可执行文件会经历这样几个过程:

    预编译:将代码中带有#的地方进行处理,其中也就包含条件编译和宏定义,就比如h文件的前面会有一个#ifdef,其就是防止符号被重定义。#define比较特殊,其是是宏定义,且有比较多的妙用,其功能是替换某些变量和字符,就因为其该特性其有很多的优势,能方便替换变量、能加快代码知执行速度、能全局修改符号,后续其他部分的文章中会展开其这些优势进行说明,看客可以自己脑补一下。

                                       

     

                                                                      图1 代码变为可执行文件的过程

    编译:编译是将预编译之后的代码编译成汇编代码,再编译成二进制目标文件。到了这个过程就是输出.o文件了。这个过程会有高级语言的语法分析和编译器的优化,除去设计硬件架构的兄弟,搞编译器的兄弟应该是最了解硬件架构的了。编译器其实就是一个翻译,翻译的好坏会影响硬件架构的执行效率,所以对于效率要求比较高的程序,一个好的编译器就很重要了。

                                                                    

                                                                       

                                                                             图2 链接和重定位的过程(以变量为例)

    链接:编译之后生成的是二进制的目标文件,但是其还无法执行,因为其缺少入口函数,可以简单理解为C语言中的main函数。二进制文件可以直接链接成为可执行文件,也可以成为动态库和静态库。静态库可以简单理解为多个二进制目标文件压缩起来的一个大的包,其还可以解压回原来的目标文件。动态库则对目标文件相应的段进行整合,无法恢复原有的目标文件。在目标文件链接成为可执行文件的时候有个重定位的过程,其就是将各个目标文件中的各个组成部分重新在新的可执行文件中排列好并记录位置的过程。具体可执行文件是由什么组成可参见参考资料,后续也会展开介绍。

    到此为止,一段C/C++代码就变成了可执行的代码了,看完是不是觉得hello world的编译实现更加的清楚了,赶快试一下了!

    知识拓展:

    1. 《程序员的自我修养》
    2. 彻底理解链接器:二,符号决议
    3. 彻底理解链接器:三,库与可执行文件
    展开全文
  • C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统...
  • C语言编译和链接过程

    2019-09-26 09:33:32
    文章目录C语言文件编译和链接过程总体过程预处理编译汇编链接静态链接库和动态链接库静态库在程序链接阶段被复制到了程序中,和程序运行时候没有关系动态库在链接阶段没有被复制到程序中,而是程序在运行时由...

    C语言文件编译和链接过程

    总体过程

    预处理\rightarrow编译\rightarrow汇编\rightarrow链接

    在这里插入图片描述

    预处理

    cpp(c预处理器)将源程序main.c翻译成ASCII码的中间文件main.i

    cpp [other arguments] main.c /tmp/main.i
    

    编译

    cc1(c编译器)将main.i翻译成ASCII汇编语言文件main.s

    cc1 /tmp/main.i -Og [other arguments] -o /tmp/main.s
    

    汇编

    as(汇编器)将main.s翻译成可重定位目标文件main.o

    as [other arguments] -o /tmp/main.o /tmp/main.s
    

    sum.c经同样的过程,生成sum.o

    链接

    链接器程序ld将main.o、sum.o和一些必要的系统目标文件组合起来,创建一个可执行文件prog

    静态链接库和动态链接库

    • 静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系

    • 动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用

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

    2020-07-23 22:29:53
    c语言的编译过程中,主要是对宏定义、条件编译语句、头文件包含语句以及特殊符号进行处理。 对于宏定义语句,比如#define NAME “user”,则在预编译阶段,会将程序中所有的NAME都替换为usr,当前有一点值得...

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

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

    编译过程如下:

    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中),链接所要做的就是将这些函数库中相应的代码组合到目标文件中去。

    链接分为:

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

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

     

    转载:https://www.cnblogs.com/zzdbullet/p/9911226.html 

    展开全文
  • C语言的编译链接过程详解 学过C语言的人都应该知道,我们所编辑的C语言程序是不能直接放到机器上运行的,它只不过是一个带".c"后缀的文件(也称为源代码)而已,需要经过一定的处理才能转换成机器上可运行的可执行...
  • 预处理 1.含义 程序设计领域中,预处理一般是指在程序源代码被翻译为目标代码过程中,生成二进制代码之前过程。典型地,由预处理器(preprocessor) 对程序...最常见预处理是C语言和C++语言。ISO CISO C++都规定
  • 而在翻译环境中可看做如下图过程首先源文件经过编译器生成目标文件,目标文件在和链接库一起经过连接器生成可执行程序。 在翻译环境中可以看成编译+链接过程在其中又要经过多个步骤来生成可执行程序如下图所示 ...
  • C语言的编译链接执行过程

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

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,815
精华内容 1,126
关键字:

c语言的编译和链接

c语言 订阅