动态链接库不能直接运行,也不能接收消息。它是一个独立的文件,包含能被可执行程序或其他DLL来调用其函数完成某项工作。
只有在其他模块调用动态链接库中的函数时,动态链接库才发挥作用。在实际编程中,可以把完成某种功能的函数放在一个动态链接库中,
提供给其他程序调用。使用 DLL 是一种重用代码的绝佳方式。 您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,
然后从需要该功能的应用程序引用它们即可。
静态库(.LIB):
静态链接库中的所有指令全部被包含在最终生成的可执行文件(.EXE)中。发布可执行文件时,不需要发布静态链接库。
动态库(.lib和.dll):
动态链接库一般包含两个文件:引入库文件(.lib)和DLL文件(.dll)。引入库文件包含DLL文件导出的函数和变量的符号名,即API接口;
DLL文件包含实际的函数和数据。在使用动态库进行编译连接时,只需要链接引入库文件。当可执行程序运行时,需要动态库中的某个函数时,
才去加载所需的DLL,将DLL映射到进程的地址空间中,然后访问DLL中的导出的函数。发布产品时,除了发布可执行文件,还要同时发布该程序中将要调用的动态链接库。
MSDN例子: https://msdn.microsoft.com/zh-cn/library/ms235636(v=vs.80).aspx
制作Dll文件:
1.文件--项目--Win32 控制台程序
2.名称:MathFuncsDll
解决方案名称:DynamicLibrary
3.应用程序类型--DLL、空项目
4.新建.h文件----添加MyMathFuns类,程序如下:
注:namespace MathFuncs { class MyMathFuncs { public: ///Return a+b <span style="color:#ff0000;">static _declspec(dllexport)</span> double Add(double a,double b); ///Return a-b static _declspec(dllexport) double Subtract(double a,double b); ///Return a*b static _declspec(dllexport) double Multiply(double a,double b); ///Return a/b static _declspec(dllexport) double Divide(double a,double b); ///注:_declspec(dllexport)修饰符:使DLL能够导出该方法以供其他应用程序使用 }; }
__declspec(dllexport) 修饰符:使 DLL 能够导出该方法以供其他应用程序使用。
5.新建.cpp文件:
#include "MathFuncsDll.h" #include <stdexcept> using namespace std; namespace MathFuncs { double MyMathFuncs::Add(double a,double b) { return a+b; } double MyMathFuncs::Subtract(double a,double b) { return a-b; } double MyMathFuncs::Multiply(double a,double b) { return a*b; } double MyMathFuncs::Divide(double a,double b) { if(b==0) { throw new invalid_argument("b cannot be zero!"); } return a/b; } }
6.项目--属性--配置属性--常规--配置类型--.dll
7.生成解决方案。此时,在项目文件夹下新增了Debug文件夹,文件夹中包含新生成的.dll/.lib等文件。
在程序中调用DLL文件:
此方法即添加OpenCV动态链接库的方法。
步骤:
1.将.h/.lib/.dll复制到工程文件夹中
例:
Project->xxxSystem(解决方案)->xxxSystem(项目)->.h
Project->xxxSystem(解决方案)->Debug->.lib/.dll
2.项目→属性→VC++目录→库目录→添加.lib文件的绝对地址
或:在解决方案--右键--添加--.lib/.dll
3.添加头文件
例:在xxxxxx.cpp中用到,则
#include "MyMathFuncs.h"
……
void Cxxxxxx::OnBnClickedButton1()
{
CString str;
doublea = 7.4,c;
int b =99;
c=MathFuncs::MyMathFuncs::Add(a,b);
str.Format("a+b=%lf",c);
MessageBox(str);
}