C++ 动态链接库及静态库的创建和简单使用

在这里

我用vs2017 创建了一个DLL 工程,

定义一个头文件. 


#ifndef MYDLL_EXPORTS
#define MYDLL_API _declspec(dllexport)
#else
#define MYDLL_API _declspec(dllimport)
extern "C" MYDLL_API int GetSum(int);
extern "C" MYDLL_API void ShowMsg();

其中 extern"C" 是以 C语言的形式编译的。 如果在这个头文件中找不到的话,就会去其它的头文件进行寻找.

MYDLL_API 后面 加的是函数类型 名称 参数; 你需要使用的函数名称。

然后 在它的 定义文件中。包含这个头文件,然后去定义这两个函数。

格式如下:

                

extern "C" MYDLL_API int GetSum(int a)
{
 return a;
}
extern "C" MYDLL_API void ShowMsg()
{
 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); ->关闭句柄
 std::cin.get();


那么打印的就是 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。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值