您的位置:首页 > 其它

程序是怎样炼成的

2014-06-22 21:30 218 查看
今天是周末,没什么事便去图书馆溜达溜达,找本书翻翻,发现《Linux入门很简单》这本书,感觉不错。作者以ubuntu为第一人称讲述linux相关的知识。具体都讲了什么我就不一一介绍了,内容很风趣,有些知识点让人很容易接受和理解。刚开始吸引我的是apt相关内容,我之前一直用apt但是都不知道其还有那些功能,具体是做什么的。看完之后感觉收获不小。又看了一下安装过程,分区,BIOS,和grub什么的,感觉作者的讲述真的是简单易懂。这些内容我就暂不介绍了,刚刚看完本书的最后一章,程序是怎样炼成的感觉自己对程序的理解有近了一步,下面记录一下这章的相关内容。在此也推荐一下这本书给喜欢linux下编程的同学,真的很不错哈!

1、编译过程详解

有时候我们编译一个简单的程序如:gcc main.c -o main,虽然只用了一个gcc命令,但其实GCC其实是一个编译器套装,一个以gcc命令为首的施工队,该施工队主要成员有gcc,cpp,as和ld这四个命令。

施工第一步--预处理:什么是预处理就不多说了,就是将文件中的红定义展开。命令为gcc -E main.c > main_cpp.c,或者直接使用预处理命令cpp main.c > main_cpp.c,这样几行的程序可能就变成几百行了。

施工第二部--编译:源文件变成了汇编文件,命令为gcc -S main.c ,得到main.s文件。

施工第三步--汇编:as拿到汇编代码后在对其处理就得到了真正的机器码,也叫汇编过程。文件从文本格式变成了二进制文件。命令为gcc -c main.c,得到main.o文件。

施工第四补--链接:经过预处理、编译、汇编之后的二进制代码,按说已经是机器码了,但是这时程序还是不能直接运行,还不完整。它只是main.c对应的机器吗,而其还调用了printf()等函数,在stdio库中,这就需要把这段stdio库中的机器码和我们编译的机器码链接起来。ld负责把这些机器码组装起来,然后就可以运行了。命令为gcc main .c ,一步搞定。

2、修理工--GDB

待补充

3、包工头--make

施工计划书Makefile,就是make用的file,就相当于一份施工计划书,上面写着整个工程分为几个模块,先用那几个文件编译成.o文件,再怎么链接,最后得到可以运行的二进制程序。make就是根据makefile来知道GCC他们进行施工。

4、分析师--configure

大家在源码安装软件的过程知道,在make之前还有一个./configure命令。它是做什么的呢?编译好的二进制程序不是放到哪里动能运行,其实运行它还需要很多库文件来协助。如果该系统里没有这个程序所依赖的库,那程序指定运行不起来。因此,configure就是在开工之前对施工环境进行检查,材料是否充足。configure是每个软件自带的一个脚本,不像make本身是一个程序。运行 ./configure后,他会检查有什么库,什么编译器,然后因地制宜的设计一份Makefile。如果条件不足,就会报错,告诉用户缺什么。

5、规划局--Autoconf

Autoconf是用来自动生成configure脚本的,它由四个成员组成:Aclocal,Autoconf、Automake和Autoscan。Autoscan负责检查源码目录结构,看看有哪写需要编译的文件。Aclocal用于检测一些编译环境相关的内容,例如使用哪个编译器。Autoconf负责生成configure脚本。Automake负责生成Makefile的蓝本-makefile.in。具体过程需要修改一些内容,我就不多说了。

记录以上内容,感觉自己对c语言在linux下的编程理解更近了一步,希望大家也有所收获,没怎么看懂的话直接看书吧 ,还是很不错的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: