lib(静态库)和dll(动态库)的生成和使用详细说明以及注意事项

1.lib库我们称之为静态库,在编译的时候调用,而dll库早使用的时候地时候调用。在这里插入图片描述在这里插入图片描述
在这里插入图片描述
如果你希望自己写的库既能给c语言用,又能给c++语言用。就需要写一个宏,如下所示,这个宏表不管是C++工程调用还是C工程调用,都以C的方式调用

#ifdef __cplusplus
extern "C"
{
	#endif
		int ADD(int a,int b);
	#ifdef __cplusplus
}
#endif

6.库函数返回的数据类型
在这里插入图片描述

3.2 显示加载方式加载dll
另一种是通过LoadLiabrary函数显示加载dll。代码如下。需要注意的是这时候我们不再需要注册.lib文件,也不需要声明外部函数。只要在需要使用的地方调用dll文件即可。

void CXXXDlg::OnBtnSubtract()
{
    // TODO: Add your control notification handler code here
    HINSTANCE hInst;
    hInst = LoadLibrary(L"Dll1.dll");
    typedef int(*SUBPROC)(int a, int b);
    SUBPROC Sub = (SUBPROC)GetProcAddress(hInst, "subtract");
    CString str;
    str.Format(_T("5-3=%d"), Sub(5, 3));
    FreeLibrary(hInst);       //LoadLibrary后要记得FreeLibrary
    MessageBox(str);
}

动态库加载出现的问题:
方案1:
usb.h文件:

#ifndef USBDLL_H
#define USBDLL_H
//
//
//条件编译指令
#ifndef  _ADDAPI
       #define  ADDAPI _declspec(dllexport)
#else  
       #define  ADDAPI _declspec(dllimport)
#endif
//
//声明导出函数
//__declspec(dllexport)

extern "C"  int ADDAPI getUSbDev();///导出函数
extern "C"  int ADDAPI sendUSbmessage();extern "C" 改为C语言的调用方法,cpp文件函数就不会被改名

#endif

usb.cpp文件:

typedef int (*PADD)(int a,int b);
typedef int (*SUB)(int a,int b);
///注意C++语法会改变动态库函数的名字,必须将函数的名字从usbdll.cpp改为usbdll.c
int main()
{
	HMODULE hdll=LoadLibrary(L"../Debug/testdll.dll");
	if (hdll==NULL)
	{
		printf("动态可加载失败 ")
	}
   PADD pAdd=(PADD)GetProcAddress(hdll,"add");
   SUB  pSUb =(SUB)GetProcAddress(hdll,"sub");
    //pAdd就是add,pSUb就是sub函数
	FreeLibrary(hdll);///动态加载的好处就是可以自动释放
}

方案2:

#pragma comment(lib,"hid.lib");隐式调用动态库,不存在函数名乱码问题

方案3:
创建模块定义文件(def文件)。将函数名字依次每列写进去。动态库函数名字就不会被改
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网小镇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值