C/C++ 代码编译过程
很久很久没用过 C/C++ ,突然碰到编译过程,竟有些想不起来,这里复习一下
C 语言的编译链接过程要把我们编写的一个 C 程序(源代码)转换成可以在硬件上运行的程序(可执行代码,如汇编语言、机器语言)
分两个部分,编译和链接
编译
把文本形式源代码翻译为机器语言形式的目标文件的过程,.c/.cpp 文件经过编译器后,成为 .s 文件(汇编代码),再经过汇编器形成目标代码 .o 文件,整个过程为编译过程
故,编译可以分为两个阶段,编译和汇编
编译阶段,编译器会首先进行预处理,预处理主要对下面的内容进行处理:宏定义指令、条件编译指令、头文件包含指令、特殊符号
编译阶段,编译还会进行一些优化,检查语法规则,然后把代码生成为汇编码
汇编阶段,把汇编码生成为目标机器所能够读取的机器码
链接
编译阶段生成的机器码实际上还不能马上运行。因为头文件中只有函数的定义,没有函数的内容。函数的内容通常封装再dll动态库(Linux下为 .so 后缀文件或者 lib 静态库(Linux下位 .a 后缀文件)文件中。链接阶段,需要告诉编译器,去哪里找这些库文件,以及库文件的名称。
同时还需要在IED(VS)中指定库目录已经链接器链接文件的名称,即依赖项
是把目标文件、操作系统的启动代码和用到的库文件进行组织,形成最终生成可执行代码的过程
链接的主要内容就是把各个模块之间相互引用的部分正确的衔接起来。其工作就是把一些指令对其其他符号地址的引用加以修正。链接过程包括了地址和空间分配、符号决议和重定向。