“......缺少xxx.dll.....”,想必大家都碰见过这样的错误,但是很抱歉,在这里并不会讲具体怎么解决这个错误,只是借这个错误引出“动态库”(这个xxx.dll就是一个动态库),借“动态库”引出静态库的概念。

 

在使用C/C++编程的时候,我们通常使用*.h和*.cpp的方式来书写我们的代码,可这存在一个问题:当我们需要将写好的功能分享给别人时候的时候,如果同时把*.h和*.cpp交给别人势必会造成我们的代码泄漏。


静态库动态库很好地解决了这个问题,即:可以将写好的功能分享给他人,又可以将关键部分代码隐藏。

 

静态库


生成静态库:


1.创建Win32项目。

Windows下的静态库和动态库


2.选择“静态库”项目,取消勾选“预编译头”。Windows下的静态库和动态库


3.修改项目属性。

 Windows下的静态库和动态库


4.选择“MTd”。

Windows下的静态库和动态库


5.写代码。

Windows下的静态库和动态库


6.按F7编译,编译通过后,去相应的文件夹下找到对应的“*.h”和“*.lib”文件,本实例是:“MyMath.h”和“StaticLib.lib”。将这两个文件交给别人来使用就可以了。

 

使用静态库:


新建一个项目,将“MyMath.h”和“StaticLib.lib”复制到项目文件夹中。

如图:

Windows下的静态库和动态库


 ---------------------------------------

动态库


生成动态库:


1.创建Win32项目。

Windows下的静态库和动态库


2.选择“DLL”项目。

 Windows下的静态库和动态库


3.修改项目属性。

 Windows下的静态库和动态库


4.不使用预编译头。

Windows下的静态库和动态库


5.选择“MTd”。

Windows下的静态库和动态库


6.写代码。相比静态库,动态库需要写的代码要多出一部分,即:使用__declspec(dllexport)__declspec(imexport)声明动态库的导入导出。通常由作者在头文件中使用条件编译并提供该头文件,使用者直接包含该头文件即可。

说明:如果动态库需要兼容C语言,请加上externC声明,这将使用C风格编译。

例:extern “C” class DLL MyMath{...}

如图:

Windows下的静态库和动态库


7.按F7编译,编译通过后,去相应的文件夹下找到对应的“*.h”、“*.lib”和“*.dll”文件(比静态库多出“*.dll”文件),本实例是:“MyMath.h”、“DynamicLib.lib”和“DynamicLib.dll”。将这三个文件交给别人来使用就可以了。

 

使用动态库:

新建一个项目,将“MyMath.h”、“DynamicLib.lib”和“DynamicLib.dll”复制到项目文件夹中。

Windows下的静态库和动态库


有话说:

1.“动态库”通常是在Windows下的说法,Linux下通常有另外一个名称“共享库”。

2.静态库、动态库不仅可以作用于类,也可以作用于函数。本质上应该是“”作用于函数,作用于类时,实际上是作用于类的成员函数。

相关文章: