目录
1 预处理
2 编译
3 汇编
4 链接
5 文件大小情况
依次执行下面4个步骤
- 预处理
- 将所有头文件展开,比如stdio.h等,展开就相当于把stdio.h中的所有代码粘贴到你的代码里。
- 将所有的宏文件展开,像stdio.h是官方定义的头文件,宏文件可以理解为自定义的头文件
- 进行条件编译,比如:获取编译环境信息,比如当前是什么系统,系统位数是多少。再比如获取编译成exe的名字
- 将代码中的注释删掉
- 在预处理阶段不会检查语法
- 编译:
- 检查语法,检查没问题后将预处理后的文件生成汇编文件
- 汇编
- 将汇编文件生成目标文件(二进制文件)
- 链接
- .h文件也是高级语言,它有一些在上述过程中无法转换为二进制,在这一步会将目标文件与一些必要的库链接起来,最终生成一个二进制文件
- 如果你用了头文件的函数但并没有导入头文件会在这一步报错而不是编译时报错
我们可以使用gcc进行分步编译
1 预处理
helloworld.c文件是这样的
通过预处理 由.c文件得到.i文件
用记事本打开helloworld.i,首先可以发现头文件被展开了
拉到最下面发现之前的注释消失了
2 编译
由 .i 文件得到 .s文件
用记事本打开helloworld.s发现里面变为了汇编语言,汇编语言中别的不一定认识,这个movl只要接触过汇编语言的应该有所了解
- 这里的汇编格式是GCC的格式,所以和我们自己写的汇编不是很一样,有的地方会啰嗦些
3 汇编
由 .s 文件得到 .o文件
记事本的默认编码方式应该是utf-8,.o文件是二进制文件,你用记事本打开就乱码了
二进制是人类看不懂的,如果你想打开你可以用python下面的代码打开它
with open('E:\\笔记\\C语言笔记\\代码\\3.C程序编译步骤\\helloworld.o','rb') as f:
print(f.read())
4 链接
由.o文件得到exe文件
- 写不写最后的exe都会给你搞出一个exe来
关于链接的库,实际上就是dll文件,你可以用 dependcy walker.exe 来查看链接库的情况,首先到官网进行下载 Dependency Walker (depends.exe) Home Page
我当前系统是win10,我下载的是这个
下载后得到一个压缩包,压缩包解压后会得到下面三个文件
双击打开exe后,先点击options然后点击Configure Module Search Order。这个是设置从哪里找。我们需要限制寻找的范围,不然depends.exe会未响应
会从右边找库,移动到左边表示不从那里找。比如我现在将PATH移动到左边,就表明不从PATH中找库了
移动完毕之后是这样的
如果你还想添加路径,那就点Browse,然后找到你要添加的路径,之后点击Add Directory
确定后点击OK
之后点击OK关闭窗口,然后把需要看链接的exe拖到Dependency Walker就可以看到链接的情况了
5 文件大小情况
在.i文件中由于把头文件展开了,它里面放的内容多,所以文件比.c文件大了很多。exe最大