![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/db8695404e1f53e8fbfac78ea46c86bb.png)
函数声明与定义
函数未声明的错误产生于 “编译” 阶段,编译阶段检查的是语法错误
函数未定义的错误产生于 “链接” 阶段,链接阶段关心的是怎么实现
预处理
g++ -E hello.cpp -o hello.i
预处理主要对预处理指令做出处理,例如对 #define 的替换,插入 #include 的头文件等操作。
编译
g++ -S hello.i -o hello.s
编译将预处理后的代码文件“翻译”成汇编语言的文件
汇编
g++ -C hello.s -o hello.o
汇编将汇编语言文件“翻译”成机器代码的二进制文件
链接
g++ -O hello.s -o hello.exe
链接就是把每个源代码独立编译后的结果,然后按照它们的要求将它们组装起来,链接主要解决的是源代码之间的相互依赖问题。
Linux下:静态链接库:xxx.a,动态链接库:xxx.so
Windows下:静态链接库:xxx.lib,动态链接库:xxx.dll
链接分为两种
静态链接:(浪费空间、更新困难,但执行时速度快)在链接阶段,将代码拷贝到可执行程序中,用到该库的程序都会被装入到该进程的虚拟地址空间中。
动态链接:(运行时每次都要重新链接,但是节省内存、更新方便)代码被放到一个动态链接库或共享目标文件中,链接程序只是在最终的可执行程序中记录了共享对象的名字等信息。在程序执行时,动态链接库的全部内容都会被映射到运行时相应的虚拟地址的空间。