C之编译和链接(十八)

我们平时所做的编译工作其实是由编译器来完成的,那么编译器都是由哪几部分构成的呢?包括四大部分:预处理器、编译器、汇编器以及链接器组成。我们来看看一个由 file.c 文件是怎样得到 file.o 文件的,如下

a> 预编译:处理所有的注释,以空格代替;将所有的 #define 删除并且展开所有的宏定义;处理条件编译指令 #if, #ifdef, #elif, #else, #endif;处理 #include,展开被包含的文件;保留编译器需要使用的 #pragma 指令。预处理指令示例:gcc -E file.c -o file.i

b> 编译:对预处理文件进行词法分析、语法分析以及语义分析;在分析结束后进行代码优化并生成相应的汇编代码文件。词法分析是指分析关键字,标识符及立即数等是否合法;语法分析是指分析表达式是否遵循语法规则;语义分析是指在语法分析的基础上进一步的分析表达式是否合法。编译指令示例:gcc -S file.i -o file.s

c> 汇编:汇编器将汇编代码转变为机器可以执行的指令,每条指令语句几乎都对应一条机器指令。汇编指令示例:gcc -c file.s -o file.o

总得来说编译过程分为预处理、编译、汇编和链接四个阶段,预处理就是处理注释,宏以及已经以 # 开头的符号;编译就是进行词法分析、语法分析以及语义分析;汇编就是将汇编代码翻译为机器指令的目标文件。

那么链接器的作用主要是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。它分为静态链接和动态链接两种。

a> 静态链接:指由链接器在链接时将库的内容直接加入到可执行程序中。关系如下

Linux 下静态库的创建和使用:1、编译静态库源码:gcc -c lib.c -o lib.o;2、生成静态库文件:ar -q lib.a lib.o;3、使用静态库编译:gcc main.c lib.a -o main.out

b> 动态链接: 可执行程序在运行时才动态加载库进行链接,库的内容不会进入可执行程序当中。关系如下

Linux 下动态库的创建和使用:1、编译动态库源码:gcc -shared dlib.c -o dlib.so;2、使用动态库编译:gcc main.c ldl -o main.out;3、关键系统调用:dlopen:打开动态库文件,dlsym:查找动态库中的函数并返回调用地址,dlclose:关闭动态库文件。

总得来说,链接是指将目标文件最终链接为可执行程序。根据链接方式的不同,链接过程可分为:静态链接,将目标文件直接链接进可执行程序;动态链接,在程序启动后才动态加载目标文件。后面我们会继续对 C 语言的学习。

欢迎大家一起来学习 C 语言,可以加我QQ:243343083。

原文地址:http://blog.51cto.com/12810168/2097189

时间: 2024-10-26 14:31:12

C之编译和链接(十八)的相关文章

[WebGL入门]十八,利用索引缓存来绘图

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 对应复杂的模型 上次,通过操作模型坐标变换矩阵,实现了多个模型的移动,旋转和放大缩小.但是,渲染的依然是简单的三角形,是个构造及其简单的模型.但是实际中,用WebGL来绘制一个简单的三角形的机会是很少见的.至少是个四角多边形吧,通常会是更复杂的模型.伴随着模型的复杂化

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径

48. 蛤蟆的数据结构笔记之四十八的有向无环图的应用关键路径 本篇名言:"富贵不淫贫贱乐 ,男儿到此是豪雄.-- 程颢" 这次来看下有向无环图的另一个应用关键路径. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47135061 1.  关键路径 与AOV-网相对应的是AOE-网(Activity On Edge)即边表示活动的网.AOE-网是一个带权的有向无环图,其中,顶点表示事件(Event),弧表示活动,权表

企业搜索引擎开发之连接器connector(二十八)

通常一个SnapshotRepository仓库对象对应一个DocumentSnapshotRepositoryMonitor监视器对象,同时也对应一个快照存储器对象,它们的关联是通过监视器管理对象DocumentSnapshotRepositoryMonitorManagerImpl实现的 DocumentSnapshotRepositoryMonitorManagerImpl类要实现那些行为,先查看其实现接口DocumentSnapshotRepositoryMonitorManager定义

企业搜索引擎开发之连接器connector(十八)(待编辑)

创建并启动连接器实例之后,连接器就会基于Http协议向指定的数据接收服务器发送xmlfeed格式数据,我们可以通过配置http代理服务器抓取当前基于http协议格式的数据(或者也可以通过其他网络抓包工具抓取) // 设置代理 /Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("IP地址", "端口")); synchronized (this) { uc = (HttpURLConnect

程序员的奋斗史(三十八)——大学断代史(二)——我与数据库的故事

文/.温国兵 惰性人皆有之,也算是人的一大天性.几日之前便构思好此文,怎奈每日杂事繁多,今日才提起笔,作下此文.本文谈谈我与数据库的故事. 说起和数据库结缘,还得从大一说起.大一刚开始接触C语言,每日就沉浸在无止境的代码中.在网上查资料的过程中,看到别人用C语言写了一个小型的图书操作程序,数据库采用的是SQL Server,运行出来的效果图很炫,惊叹原来还可以这样管理数据.熟知C语言的同学肯定对文件操作不陌生,当时我们写程序如果有静态数据,都是放在文件里的.直到后来做的C语言课程设计,我也是一大

Cocos2d-x 3.x 开发(十八)10行代码看自动Batch,10行代码看自动剔除

1.概述 在游戏的运行过程中,图形的绘制是非常大的开销.对于良莠不齐的Android手机市场,绘制优化较好的游戏,可以在更多的手机上运行,因此也是优化的重中之重.图形方面的优化主要体现在减少GUP的绘制次数上.这里我们分别从自动优化渲染批次和绘制剔除两个方面来看新版本在绘制上的优化. 2.自动batch 在Cocos2d-x 3.x中,抛弃了先前手动编写BatchNode,采用自动管理的方式.说起BatchNode,就难免涉及到显卡底层的绘制原理.简单的说,每提交一条绘制指令到显卡都会产生消耗,

NeHe OpenGL教程 第三十八课:资源文件

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十八课:资源文件 从资源文件中载入图像: 如何把图像数据保存到*.exe程序中,使用Windows的资源文件吧,它既简单又实用. 欢迎来到NeHe教程第38课.离上节课的写作已经有些时日了,加上写了一整天的code,也许笔头已经

Python之路【第十八篇】:Web框架们

Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. 1 2 3 4 pip install bottle easy_install bottle apt-get install python-bottle wget http://bottlepy.org/bottle.py Bottle框架大致可以分为以下部分: 路

【OpenCV新手教程之十八】OpenCV仿射变换 & SURF特征点描写叙述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本号: 2.4.9 本篇文章中.我们一起探讨了OpenCV

【转载】COM 组件设计与应用(十八)——属性包

原文:http://vckbase.com/index.php/wv/1265.html 一.前言 书接上回,本回着落在介绍属性包 IPersistPropertyBag 接口的实现方法和调用方式.属性包,是以“名称 - 值”的方式提供组件持续性的支持,而“名称 - 值”恰恰又适合于用文本方式来表现.下面的片段是在 HTML 中插入 Microsoft MonthView Control ActiveX 控件后的样式: <object classid="clsid:232E456A-87C