C++ 重点知识梳理(六) -------- 编译和链接

八、编译和链接?

8.1 动态链接库和静态链接库的区别?

C++ 重点知识梳理(六) -------- 编译和链接

用今天的眼光来看,动态链接库节约内存这个优点越来越不重要了,特别是在服务器上:a)、现在PC的内存都很大,指令占用那一点空间已经微不足道了;b)、由于动态链接库冲突等问题,越来越多的服务器应用更倾向于把所有用到的环境文件用docker打包,这样一来占用内存也不少。
 

相关问题:

8.2 链接指示 extern "C"有什么作用?

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。
这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。
这个功能主要用在下面的情况:
1、C++代码调用C语言代码
2、在C++的头文件中使用
3、在多个人协同开发时,可能有的人比较擅长C语言,而有的人擅长C++,这样的情况下也会有用到

8.3 现代编译器的编译过程?

  1. 预编译,展开所有的宏定义#define, 处理所有的预编译指令如#if,递归的包含文件#include,删除所有注释,添加行号和文件标识,保留所有的编译指令#pragma。
  2. 编译
    1. 词法分析
    2. 语法分析
    3. 语义分析
    4. 优化生成汇编代码
  3. 汇编,将汇编代码转化成机器可以执行的指令,得到目标文件(.o \ .obj),
  4. 连接,链接将目标文件进行处理,得到可执行文件。

8.4 pdb文件有什么用?

Visual Studio 调试需要pdb文件。Native C++ PDB包含了如下的信息:

* public,private 和static函数地址;
* 全局变量的名字和地址;
* 参数和局部变量的名字和在堆栈的偏移量;
* class,structure 和数据的类型定义;
* Frame Pointer Omission 数据,用来在x86上的native堆栈的遍历;
* 源代码文件的名字和行数;