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中),链接所要做的就是将这些函数库中相应的代码组合到目标文件中去。
链接分为:
静态链接;就是把函数库中包含的目标代码静态添加到可执行文件中。一般静态链接生成的文件比较大。可独立运行。
动态链接;将这些函数库的路径、函数名等信息添加到可执行文件中去,在执行过程中动态加载函数库。需要函数库的支持。
原文链接:
https://www.cnblogs.com/winifred-tang94/p/5833831.html
C语言编译和链接的更多相关文章
- 菜鸟在C语言编译,链接时可能遇到的两个问题
最近在看 CSAPP (Computer Systems A Programmers Perspective 2nd) 的第七章 链接.学到了点东西,跟大家分享.下文中的例子都是出自CSAPP第七章. ...
- C语言编译和链接过程
1.程序的编译 一般而言,大多数编译系统都提供编译驱动程序(complier driver),根据用户需求调用语言预处理器,编译器,汇编器和链接器.例如有如下历程://main.c void swa ...
- C语言编译和链接详解(通俗易懂,深入本质)
我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为可执行程序(Executable Program).在 Windows 下,可执行程序的后缀有.exe和.com(其中.exe比较常 ...
- C语言编译链接
转载请标明: 编译链接是使用高级语言编程所必须的操作,一个源程序只有经过编译.链接操作以后才可以变成计算机可以理解并执行的二进制可执行文件. 编译是指根据用户写的源程序代码,经过词法和语法分析,将高级 ...
- C语言预处理 编译 汇编 链接四个阶段
c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接. 编译过程 编译过程又可以分成两个阶段:编译和会汇编. 编译 编译是读取源程序(字符流),对之进行词法和语法的分析,将高 ...
- 窥探C语言程序的编译、链接与.h文件
概述 C语言程序从源文件经过编译.链接生成可执行文件.那么编译与链接分别做了什么? 开发中为什么使用.h编写函数的声明?接下来使用案例说清楚为什么这样编写代码. C语言程序的编译和链接 C语言程序从源 ...
- C语言讲义——“编译、链接”
HelloWorld 最简HelloWorld include <stdio.h> 指令:标准输入输出头文件. main函数 C语言程序的唯一入口. #include <stdio. ...
- C语言的编译与链接
C语言源文件要经过编译.链接才能生成可执行程序:编译(Compile)会将源文件(.c文件)转换为目标文件.对于 VC/VS,目标文件后缀为.obj:对于GCC,目标文件后缀为.o.编译是针对单个源文 ...
- C语言的“编译、链接”
我们写的代码,仅仅是文本文件(txt),不管后缀怎么变,终究是文本文件,计算机只能显示,不能做事(执行). 文本文件通过“编译.链接”,成为可执行文件(windows下是exe): 编译:生成.o文件 ...
随机推荐
- 嵌入式平台选择:树莓派 or BeagleBone Black(BBB)
原文链接: Michael Leonard 翻译: 极客范- 小道空空 译文链接: http://www.geekfan.net/5246/ 嵌入式平台选择:树莓派 or BeagleBone Bla ...
- Laravel 多条件搜索查询
做查询功能时,输入的关键词有的为空,有的有值,如何实现多功能查询呢?这里介绍一种方法.(基于laravel) 原理很简单,第一步:判断接收的值,第二步:写查询语句.具体实现如下: //首先,创建句柄: ...
- 当一个线程进入一个对象的一个synchronized方法后, 其它线程是否可进入此对象的其它方法?
分几种情况: 1.其他方法前是否加了synchronized关键字,如果没加,则能. 2.如果这个方法内部调用了wait,则可以进入其他synchronized方法. 3.如果其他个方法都加了sync ...
- linux下如何查看cpu信息
linux的cpu信息可以从文件中cpuinfo读取. 执行命令: # cat /proc/cpuinfo 我们一般看到的processor是逻辑核. 它的计数是从0开始的,例如这里看到的是31 ...
- selenium+xpath获取href的坑
先上HTML文档 <html> <body> <a href="http://www.example.com">Example</a> ...
- 3.如何构建Cython代码
一.与Python不同的是,Cython代码需要进行编译.发生两个阶段 将一个.pyx文件用Cython编译成一个.c文件中,包括Python扩展模块代码 将.c文件使用C编译器编译成.so文件(在w ...
- 小学生都能学会的python(函数的进阶)
小学生都能学会的python(函数的进阶) 1. 动态传参 形参: 1. 位置参数 2. 默认值参数 3. 动态传参 *args 动态接收位置参数 **kwargs 动态接收关键字参数 def fun ...
- Redis:持久化之RDB和AOF
Redis:持久化之RDB和AOF RDB(Redis DataBase) 在指定的时间间隔内将内存中的数据集快照写入硬盘 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里. R ...
- navicat连接SQL Sever数据库出现的问题
1.navicat 连接sqlserver提示要安装 sql server native client 解决办法:在navicat安装目录下有个sqlncli_x64.msi文件,双击安装一直下一步就 ...
- 【【henuacm2016级暑期训练】动态规划专题 O】Robot Rapping Results Report
[链接] 我是链接,点我呀:) [题意] 让你确定一个最小的k 使得1..k这些比赛的结果能够推导出所有人之间的实力大小 [题解] 如果关系越多.那么就越能确定所有人之间的大小关系. (多一点也能唯一 ...