C语言编译链接
转载请标明;
编译链接是使用高级语言编程所必须的操作,一个源程序只有经过编译、链接操作以后才可以变成计算机可以理解并执行的二进制可执行文件。
编译是指根据用户写的源程序代码,经过词法和语法分析,将高级语言编写的代码转变为功能有效的汇编代码。
编译过程如下:

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语言编译链接的更多相关文章
- 转:C语言的编译链接过程的介绍
11:42:30 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接 ...
- C语言编译和链接
编译链接是使用高级语言编程所必须的操作,一个源程序只有经过编译.链接操作以后才可以变成计算机可以理解并执行的二进制可执行文件. 编译是指根据用户写的源程序代码,经过词法和语法分析,将高级语言编写的代码 ...
- C语言程序经过编译链接后形成二进制映像文件的组成
C语言程序经过编译链接后形成二进制映像文件由栈,堆,数据段,代码段组成,其中数据段又分为:只读数据段,已经初始化读写数据段,未初始化数据段(BSS段).如下图所示: 1.栈区(stack):由编译器自 ...
- C语言编译和链接详解(通俗易懂,深入本质)
我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为可执行程序(Executable Program).在 Windows 下,可执行程序的后缀有.exe和.com(其中.exe比较常 ...
- C语言预处理编译链接各个阶段错误,分阶段的说一下
C语言预处理编译链接各个阶段错误,分阶段的说一下 C语言预处理编译链接各个阶段错误,分阶段的说一下比如指针异常,数组下标越界什么的 我来答 1个回答 #热议# 你觉得这辈子有希望看到996消失 ...
- C++开始前篇,深入编译链接(3)
一,COMMON块 什么是COMMON块,这是一种机制,早期的Fortran没有动态分配空间的机制,程序员必须事先声明它所需要的临时使用空间的大小.Fortran把这种空间叫做COMMON块,当不同的 ...
- C++开始前篇,深入编译链接(补充1)
针对这些问题,这次做一个补充: 一,可重定位文件的格式是什么,以main.o为例, 格式为ELF ,包括:{1,ELF Header 它描述了整个文件的文件属性,包括文件是否可以执行,是静态链接还是动 ...
- C++开始前篇,深入编译链接
C++开始,为什么要写这个东西,因为按照课堂进度的话,现在的C++已经学到模板以及重载了,有时却仍然因为一些小问题无法解答,原因是忘记了开始时学到的知识,深知不能像猴子掰棒子一样,掰一个扔一个,因此, ...
- C语言编译过程
GCC编译C源码有四个步骤: 预处理-----> 编译 ----> 汇编 ----> 链接 一. 编译和链接的流程 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在 ...
随机推荐
- 我对于MSP的理解,供参考
本人在项目管理圈儿也算是摸爬滚打了几载,近几年真是各种压力大,看同行们各种参加培训.认证......我也不能懈怠啊,赶紧上网搜搜相关的培训 ...
- keytool的使用
1. 创建数字证书 keytool -genkey -v -alias scent -dname "CN=John,OU=MNG,O=Corp,L=Hangzhou,ST=Zhejiang, ...
- 汇编中push寄存器的影响
由于汇编代码中的不同位置 ESP+40所指的地址不像EBP+40的地址那个是一定的,ESP+40指向的地址由栈顶变化影响.也就是和操作栈指令 PUSH POP 等影响. 汇编栈是一个线性的地址区间,地 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:实现基本的CRUD功能
英文渣水平,大伙凑合着看吧…… 这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列 ...
- [Golang] 一个简易代理池
晚上写了一个代理池,就是在一个代理网站上爬取代理ip和端口以及测试是否可用.接下来可能考虑扩展成一个比较大的 golang实现的代理池. 简易版代码: package main import ( &q ...
- Javascript学习笔记:6种实现继承的方式
①原型链式继承 function Person(name){ this.name=name; } Person.prototype.getName=function(){ return this.na ...
- IE的条件注释
<!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> <!--[if IE]> 所有的IE可识别 <![ ...
- C#相等性比较
本文阐述C#中相等性比较,其中主要集中在下面两个方面 ==和!=运算符,什么时候它们可以用于相等性比较,什么时候它们不适用,如果不使用,那么它们的替代方式是什么? 什么时候,需要自定一个类型的相等性比 ...
- 将php网站移到CentOS 6.7上[二]:将网站部署到服务器上
首先,确保lamp环境已安装好.准备好项目源代码,数据库备份文件等.由于没有安装好VNC,因此只能用ssh部署了. 将项目源代码压缩,Linux默认是支持SFTP的,用SFTP将源代码压缩包上传到 / ...
- 【转】 CPU大小端
大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中:小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 为什么会有大小端模式之分呢?这是因为 ...