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文件)。將函數名字依次每列寫進去。動態庫函數名字就不會被改
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章