编译过程有四个过程:预处理 编译 汇编 链接
预处理阶段
预处理器(preprocessor)会处理源代码文件中的预处理指令,如#include
,#define
等。#include
指令用于插入指定的头文件,#define
用于定义宏。预处理器还会进行条件编译,处理#if
,#ifdef
,#ifndef
,#else
,#elif
,#endif
等指令。
编译阶段
在这个阶段,编译器将预处理后的代码(已经是纯C/C++代码,没有任何预处理指令)转换成汇编代码。编译器在这个阶段也会检查代码的语法错误,如果有错就报错。
汇编阶段
汇编器将编译阶段生成的汇编代码转换成机器语言代码,也就是目标代码文件
链接阶段
符合合并,进行符号解析
链接器将一个或多个目标代码文件以及需要的库文件合并成一个单独的可执行文件。在这个过程中,链接器解析未定义的符号(例如函数或变量的引用),并将它们链接到正确的位置。
示例
sum.cpp
1 | int data = 10; |
main.cpp
1 | #include <iostream> |
执行g++ -c sum.cpp 生成 sum.o文件
并通过objdump -t 显示目标文件的符号表信息如下:
1 | D:\梦想\C++>g++ -c sum.cpp |
执行g++ -c main.cpp 生成 main.o文件
并通过objdump -t 显示目标文件的符号表信息如下:
1 | D:\梦想\C++>g++ -c main.cpp |
总结
符号的引用能找到唯一的符号定义
作者:张泽中