C语言之编译和链接

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

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

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

                                   

 

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

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

                                                                

                                                                   

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

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

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

知识拓展:

  1. 《程序员的自我修养》
  2. 彻底理解链接器:二,符号决议
  3. 彻底理解链接器:三,库与可执行文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值