可将编程时重复或常用的代码制作成相应的功能函数,使用时直接调用就会很方便,还方便后期的功能升级及代码维护。库可以分为静态库和动态库。静态库和动态库的主要区别是在链接阶段库文件的处理方式的差异上。
1.静态库
在链接阶段,会将目标文件与引用到的库文件一起打包到可执行文件中。
优点
把一些公用函数制成函数库,供其它程序使用,可提高核心技术的保密程度。
缺点:
1.空间浪费是静态库的一个问题。
2.静态库程序的更新、部署和发布会带来麻烦。整个应用程序都需要重新编译。
生成:创建静态库工程,在工程中直接定义函数及类,即可生成lib。
调用:
1.在项目属性内的VC++下的包含目录中添加原来静态库.h文件所在路径。
2.在项目属性内的连接器中的常规项下的附加库目录中添加lib文件路径,在输入项中的附加依赖项中添加*.lib。
3.引用lib中的函数或类时需在声明区包含相应的头文件
2.动态库
优点:
1.动态库在程序编译时不被连接到目标代码中,在程序运行时才被载入。
2.不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。
3.动态库在程序运行是才被载入,对程序的更新仅需更新动态库文件。
生成:
1.创建动态库工程,在工程中直接定义函数及类,在要导出的函数或类所在的头文件中。
extern "C" SERIALIZEDAO_API CAbstractDAO * CreateDAOFromDll();
extern "C" SERIALIZEDAO_API void DestroyDAO(CAbstractDAO *);
2.在相应的源文件中添加导出函数的定义
extern "C" SERIALIZEDAO_API CAbstractDAO * CreateDAOFromDll()
{
//CAbstractDAO *p=(CAbstractDAO *)CMyTool::CreateObjectByName(_T(""), _T("")); //反射【参考“C++中利用类名动态创建对象 【反射写法】”】
CAbstractDAO *p = new CSerializeDAO; //实例化
return p;
}
extern "C" SERIALIZEDAO_API void DestroyDAO(CAbstractDAO *p)
{
if (p!=NULL)
{
delete p;
}
}
调用:
1.包含上面声明的导出函数所在的头文件,并对需使用的dll中的函数做如下声明。
#include<...>
typedef CAbstractLogic* (*CreateLogicObject)();
typedef void (*DestroyLogicObject)(CAbstractLogic *);
HMODULE【或者HINSTANCE?】 dll = LoadLibrary(_T("C:\\...\\SerializeLogic.dll"));
CreateLogicObject fnCreate = (CreateLogicObject)GetProcAddress(dll, "CreateLogicObject");
DestroyLogicObject fnCreate = (DestroyLogicObject)GetProcAddress(dll, "DestroyLogicObject");
CAbstractLogic *pLogic = fnCreate();
fnDestroy(pLogic); //销毁逻辑对象
FreeLibrary(dll);
3.学生信息管理系统