在这里
我用vs2017 创建了一个DLL 工程,
定义一个头文件.
#define MYDLL_API _declspec(dllexport)
#else
#define MYDLL_API _declspec(dllimport)
extern "C" MYDLL_API void ShowMsg();
其中 extern"C" 是以 C语言的形式编译的。 如果在这个头文件中找不到的话,就会去其它的头文件进行寻找.
MYDLL_API 后面 加的是函数类型 名称 参数; 你需要使用的函数名称。
然后 在它的 定义文件中。包含这个头文件,然后去定义这两个函数。
格式如下:
{
return a;
}
{
std::cout << "111111111";
}
前面需要加 extern "C" 和 MYDLL_API
现在我们的函数已经写好了。
点击 菜单栏 -> 生成 - > 生成(你的工程名称.DLL)
生成成功后,在你的Debug目录下 查找你的DLL 动态链接文件.
现在你已经有了dll动态库文件。我们要去使用它,你用一个测试文件来测试。(记住,请把你的dll文件拷贝到,
和你的测试文件的 ,exe程序同个目录下)
首先测试文件中 包括头文件
#include“Winodows.h”
然后声明和 你在DLL中 声明的函数一样的函数指针
比如 typedef int(*pShowMsg)(int);
typedef void(*pGetSum)();
然后:
HMODULE hModule = LoadLibrary("你生成的DLL文件名称"); -> 申请一个句柄
if (!hModule)
{
std::cout << "Error!" << std::endl;
}
pShowMsg pgetm = (pShowMsg)GetProcAddress(hModule, "你的申明函数名称");
std::cout << pgetm(1) << std::endl; -> 调用
pGetSum pgetms = (pGetSum)GetProcAddress(hModule, "ShowMsg");
pgetms();
FreeLibrary(hModule); ->关闭句柄
那么打印的就是 1 和1111111111111了。
上面的是 dll 动态库 链接.
那么 现在是 静态库链接 :
静态库链接需要 你定义函数的 头文件 和lib文件. 。 头文件处于你的 链接目录下, lib文件和dll文件同处于一个目录下。
然后 把你的 lib文件 和 头文件 拷贝到 测试工程 下的cpp 同一个目录下。
然后 在测试工程下
#include "库头文件" 导入你的库头文件
#pragma comment(lib , "你的lib文件") - > 导入你的lib文件
然后
extern "C" __MIDL_DECLSPEC_DLLIMPORT int GetSum(int); -> 这里我用了这个宏定义。 == _declspec(dllimport)
extern "C" __MIDL_DECLSPEC_DLLIMPORT void ShowMsg();->
extern "C" _declspec(dllimport) 你的函数名也是可以的。
然后再 main函数中,直接去调用函数名
比如
cout<< GetSum(1) << endl;
ShowMsg();
那么也将打印 1 和1111111111111111111.
无论是动态链接库 还是 静态链接库,在Windows下面 都需要加上 头文件 windows.h。