距离上次看这本书已经俩月了哈哈,好在本来看的就不多,还记得之前的内容。暑假做完项目再来看,居然发现很多当时要靠搜索的知识这里面都有讲,要是早点看到就好了-_-||
这次是语言编译和链接的过程:
首先,对于通过gcc编译一段程序在实际上可以分为四个步骤,预处理,编译,汇编,链接。当我们使用命令: $gcc hello.cpp时,其实就是执行了这四个步骤,并且它们是可以使用命令单独进行的。
预编译
在这个阶段,.cpp和.hpp会被转为.ii文件(对于.c和.h来说是转为.i文件)。
$ gcc -E hello.c -o hello.i
使用 -E 参数可以使gcc只进行预编译。
在预编译中,所有以"#"开头的代码都会被处理,比如:
1.将所有#define的宏定义展开到具体位置,然后把这些定义删除。
2.将所有#include的内容写入到该位置,然后把这些指令删除。
3.删掉所有注释"//","/* */"。
4.添加行号等。
编译
在这个阶段,经过预处理的.i文件会经过词法分析,语法分析,语义分析然后产生相应的汇编文件
$ gcc -S hello.i -o hello.s
使用 -S 参数可以使gcc只进行编译。
在这个阶段会用到词法分析器(lexer)语法分析器(Grammar parser)和语义分析器(Semantic Analyzer),它们在汇编阶段发挥了非常重要的作用。可以到wiki看具体工作原理:https://zh.wikipedia.org/wiki/%E8%AF%AD%E6%B3%95%E5%88%86%E6%9E%90
链接
在这个阶段,会将一大堆文件链接起来,最终得到一个.out文件,也就是可执行文件。至于为什么要有一大堆文件,还得等我明天看完了,再回来补充(笑)