【C++】C++编译链接

编译和链接是C++程序从源代码到可执行程序的关键过程,理解编译链接原理可以帮助我们更好地编写和调试程序。

一、预处理

预处理会处理头文件包含、宏定义替换等预处理指令,生成预编译文件。

二、编译

编译器会将预编译文件编译成汇编文件,包含目标平台的汇编指令。

main:
push ebp 
mov ebp, esp
// ...

三、汇编

汇编程序将汇编指令转成机器码,生成目标文件。

0101000001100001010000000000

四、链接

链接器将多个目标文件和静态库链接生成可执行文件。

g++ main.o util.o -o app

链接会解析符号依赖,合并代码和数据段。

五、静态链接库

静态库(.lib,.a)会被直接合并到可执行文件中。

// libutil.a
void util() {
  // ..
}

六、动态链接库

动态库(.dll,.so)在运行时被加载,允许共享代码。

// util.dll
void util() {
  // ..
}

编译生成的导入库 handled 导入符号。

七、常见链接错误

链接时需要注意未定义符号、重复符号等错误。

综上,掌握编译链接过程可以帮助分析和解决各种编译错误,对C++开发非常重要。