C++从源文件到可执行文件的过程

450 阅读2分钟

在这里总结一下这个知识点。首先先明确有几个阶段。

1. 预编译阶段

2. 编译阶段

3. 汇编阶段

4. 链接阶段

我们下面针对每个阶段介绍一下每个阶段具体在干什么。

预编译阶段

做的工作有

1. #define字段替换,也就是宏替换。比如__LINE__, FILETIME__这种内置的预处理宏。还有之前遇到的__attribute

2. 替换#include 中的内容

3. 删除注释

4. 处理条件编译

5. 添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行

6. 保留#pragma编译器指令,因为编译器需要使用它们。

在这个阶段是不会对语法错误进行检查的。这个阶段会生成.i的文件

编译阶段

编译阶段就是将高级语言变成低级的汇编语言。在这一步会对语法进行检查。进行编译。编译分为几步:词法分析,语法分析,语义分析和优化。

汇编阶段

这一个阶段就是把低级的汇编语言变成机器语言。生成.o文件

链接阶段

这一个阶段就是把目标文件中引用的外部库中的代码链接生成可执行文件。链接分为动态链接和静态链接。静态链接就是把外部库中的代码拷贝到二进制文件里去,可能会造成重复拷贝但是跨平台性比较好。动态链接是在运行的时候去重定位外部库的代码段,可以进行代码共享但是跨平台性不如静态链接。在这里再说一个关于C++函数改名的问题。C++是支持重载的,在当存在多个重名函数的时候链接器就不知道去链接哪个了。C++的解决方法就是针对重载的函数加上前缀。比如void func(char ch)和 void func(int i)就会变成_func_char, _func_int。但是C不支持重载,所以C不会改名,因此在C++调用C的函数的时候就会出现找不到链接符号的问题。这个时候就需要指定 extern C使得C++使用C的编译规则。详情请看这篇文章www.cnblogs.com/sun-frederi…

参考资料

zhuanlan.zhihu.com/p/90890103

www.cnblogs.com/sun-frederi…