标签:
1、一个程序从源文件编译生成可执行文件的步骤:
预编译 --> 编译 --> 汇编 --> 链接
(1)预编译主要处理在源代码文件中以“#”开始的预编译指令,如宏展开、处理条件编译指令、处理#include指令等。
(2)编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。
(3)汇编是将汇编代码转变成机器指令。
(4)链接主要是把分散的数据和代码收集并合成一个单一的可加载并可执行的的文件。链接可以发生在代码静态编译、程序被加载时以及程序执行时。
链接过程的主要工作是符号解析和重定位。
2、库
库是一组目标文件的包,就是一些最常用的代码编译成目标文件后打包存放。而最常见的库就是运行时库(Runtime Library),如C运行库CRT.
库一般分为两种:
静态库(.a 、.lib)
动态库(.so 、.dll )
所谓静态、动态是指链接过程。
3、静态链接与静态链接库
静态链接:源程序经过编译器生成目标文件,目标文件和库一起生成最终的可执行文件。链接的过程就是把分布在各个可重定位的目标文件中相应的节合并起来,同时完成符号解析和重定位。
静态库:一组目标文件的集合,即很多目标文件经过压缩打包后形成的一个文件。
静态库可以作为链接器的输入,如果程序需要引用静态库提供的某个函数,链接时只需要在命令行中输入该库。连接器只拷贝被程序引用的目标模块,以及该目标模块索依赖的那些目标模块。
特点:
(1)静态链接是在编译时期完成的
(2)静态链接形成可执行文件后,运行时与静态库再无关系,方便移植。
(3)浪费内存和磁盘空间。通过静态链接产生可执行程序时,会复制所依赖的静态库中所有数据和代码到该可执行程序中。
(4)更新困难。当程序所依赖的静态库有任何更新,整个程序就要重新链接。
Windows下创建与使用静态库:
以VS2010为例
编写一个简单的计算器类,编成静态库其他程序使用,代码如下:
ifndef CALCULATOR_H_ #define CALCULATOR_H_ extern double g_max_number; double GetMinNumber(); class Calculator { public: double Add(double a, double b) const; double Sub(double num1, double num2) const; double Mul(double num1, double num2) const; double Div(double num1, double num2) const; }; #endif
cpp文件
#include "calculator.h" double g_max_number = 999; double Calculator::Add( double a, double b ) const { return (a + b); } double Calculator::Sub( double num1, double num2 ) const { return (num1 - num2); } double Calculator::Mul( double num1, double num2 ) const { return (num1 * num2); } double Calculator::Div( double num1, double num2 ) const { if (num2 != 0) { return (num1 / num2); } return 0; } double GetMinNumber() { return (-999); }
在创建VS工程时,在设置工程属性时,配置类型选择静态库即可,build即可生成静态库。
4、动态链接与动态库
标签:
原文地址:http://www.cnblogs.com/cmranger/p/4653396.html