动态链接库
动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式
函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。使用动态链接库可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分
在codeblocks环境下创建动态链接库
新建->项目->Dynamic Link library
会自动生成main.cpp和main.h两个文件
main.h如下
#ifndef __MAIN_H__
#define __MAIN_H__
#include <windows.h>
/* To use this exported function of dll, include this header
* in your project.
*/
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
void DLL_EXPORT SomeFunction(const LPCSTR sometext);
#ifdef __cplusplus
}
#endif
#endif // __MAIN_H__
其中
void DLL_EXPORT SomeFunction(const LPCSTR sometext);
是我们所要更改的内容,将它替换成我们所需要的类声明或者方法声明(注意:保留DLL_EXPORT,这是上面定义的宏,用来导出函数)
main.cpp如下:
#include "main.h"
// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}
同理
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
这段代码是我们需要自定义的内容,用来定义在.h文件中所声明的方法(同样DLL_EXPORT不可去掉)
将其编译后,会在相应的文件夹中找到libTest_DLL.a 和 Test_DLL.dll文件
当我们项目需要引用这个库中的文件的时候,我们将dll文件放在我们自建的项目中,同exe文件放在一起,并在项目中添加同上相同的.h文件。并且右键单击项目名选择构建选项(bulid opention s)
点击连接器设置。点击添加,找到刚才生成的.a(有的是.lib)文件点击确定。此时在项目中只需引用方才创建的头文件.h文件即可使用dll
注意:
上述都是用c++语言,必须使用extern "c"连接c语言标准,自动生成的代码中已经给出
并且注意 dllimport与dllexport作用与区别