在讲解动态库之前,先讲一个静态库的例子,使我们对库有一个概念。

在E:\core\src\目录下,创建一个静态库(库工程):

菜单栏:文件-->新建-->项目,如图所示:

【VC++DLL动态链接库编程】VC++静态库编译(3)_VC++DLL动态链接库编程

【VC++DLL动态链接库编程】VC++静态库编译(3)_C/C++_02

【VC++DLL动态链接库编程】VC++静态库编译(3)_VC++DLL动态链接库编程_03

此时为一个空静态库,如图所示:

【VC++DLL动态链接库编程】VC++静态库编译(3)_c/c_04

首先添加一个类:菜单栏: 项目-->添加类-->C++类, 出现如下图示,在添加类名:Person,后面的.h文件和.cpp文件名会自动出现,无需人工填写。

【VC++DLL动态链接库编程】VC++静态库编译(3)_VC++DLL动态链接库编程_05

点击完成之后,在头文件下面出现Person.h和源文件下Person.cpp。如图所示:

【VC++DLL动态链接库编程】VC++静态库编译(3)_VC++DLL动态链接库编程_06

【VC++DLL动态链接库编程】VC++静态库编译(3)_c/c_07

这里只做演示:在.cpp文件下,添加以下三句话,前两句为引用:

【VC++DLL动态链接库编程】VC++静态库编译(3)_VC++DLL动态链接库编程_08

编译一下staticLib,即菜单栏:生成-->生成解决方案(B),则生成了静态库,如下所示:

【VC++DLL动态链接库编程】VC++静态库编译(3)_VC++DLL动态链接库编程_09

此时我们来改变输出目录路径,即编译后的.lib文件所在的路径。在staticLib项目处右击属性,把输出点到库管理,或者改变常规,如图所示:

【VC++DLL动态链接库编程】VC++静态库编译(3)_c/c_10

确定之后,core目录下,即与src同一级目录下出现lib文件,如图所示:

【VC++DLL动态链接库编程】VC++静态库编译(3)_c/c_11

再重新编译staticLib,如图所示:

【VC++DLL动态链接库编程】VC++静态库编译(3)_C/C++_12

到此为止,静态库(库工程)编译成功,创建了一个静态库,得有一个(应用工程)程序去调用它。现在我们再新建一个项目,调用这个库,即把这个静态库应用起来。(讲库工程和应用工程放在同一个VC目录下,即在E:\core\src\)

新建一个应用工程(调用静态库)的项目:

文件-->新建-->项目,弹出如下图示:

【VC++DLL动态链接库编程】VC++静态库编译(3)_C/C++_13

【VC++DLL动态链接库编程】VC++静态库编译(3)_C/C++_02

【VC++DLL动态链接库编程】VC++静态库编译(3)_VC++DLL动态链接库编程_15

【VC++DLL动态链接库编程】VC++静态库编译(3)_c/c_16

在.cpp文件下,添加#include “Person.h”,将Person.h文件引用进来,如图所示:

【VC++DLL动态链接库编程】VC++静态库编译(3)_c/c_17

红斜杠,表示找不到Person.h的头文件,此处是声明,若是编译的话,就会报错,如图所示:

【VC++DLL动态链接库编程】VC++静态库编译(3)_c/c_18

解决办法,就是对TestStatic进行属性配置,即在TestStaitic项目处右击,选择属性,弹出如下图:

【VC++DLL动态链接库编程】VC++静态库编译(3)_VC++DLL动态链接库编程_19

编译,即生成-->生成解决方案(B),此时开始如下错误:

【VC++DLL动态链接库编程】VC++静态库编译(3)_VC++DLL动态链接库编程_20

报错显示:找不到Person的构造函数和析构函数。所以需要链接到Person的定义,即链接到Person的定义文件。如下:

【VC++DLL动态链接库编程】VC++静态库编译(3)_c/c_21

【VC++DLL动态链接库编程】VC++静态库编译(3)_C/C++_22

设断点调试看看效果:

【VC++DLL动态链接库编程】VC++静态库编译(3)_C/C++_23

点击“本地Windows调试器”,进行调试,其结果如下:

【VC++DLL动态链接库编程】VC++静态库编译(3)_VC++DLL动态链接库编程_24

静态库的引用:除了项目设置中的属性进行引用;还可以选择通过代码进行引用,即通过预编译的指令:#pragma comment(lib,"staticLib")这段代码只能放在cpp或c文件中,不能放在.h文件中,以防多次引用。

【VC++DLL动态链接库编程】VC++静态库编译(3)_VC++DLL动态链接库编程_25

执行文件(.exe)会变大,因为静态库都会被引用过来,而且在执行的时候不再需要原来的库了。静态库直接编译到执行文件中。

添加两句话,我们来演示一下效果:

【VC++DLL动态链接库编程】VC++静态库编译(3)_c/c_26

编译TestStatic,将静态库编译到exe文件里,然后双击.exe文件,如图所示的红框:

【VC++DLL动态链接库编程】VC++静态库编译(3)_C/C++_27

效果如图所示:

【VC++DLL动态链接库编程】VC++静态库编译(3)_C/C++_28

总结:

从上面的例子至少使我们明白,静函数到底是什么回事,对库有一个模糊认识:

(1)编写库的程序和一般的程序没有什么大的区别,只是库程序不能单独执行;

(2)库提供一些可以给别的程序调用的东东,别的程序要调用必须以某种方式指明它要调用之。


以上从静态链接库分析而得到的对库的概念,可以直接引申到动态链接库中,动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定义及调用方式稍有些差异。