鏈接庫可分為兩種:一種為靜態鏈接庫lib,一種為動態鏈接庫dll。你可以將它們看成一個倉庫,它提供了可以直接拿來使用的變量、函數或類。在現實工作中,你需要給別人提供代碼,但是又不想讓別人知道你代碼的內容,那么,鏈接庫就能解決這個問題。別人只需要調用你做好的鏈接庫,就能實現想要的功能。
靜態鏈接庫與動態鏈接庫都是共享代碼的方式,如果采用靜態鏈接庫,則無論你願不願意,lib中的指令都被直接包含在最終生成的EXE文件中了。但是若使用DLL,該DLL不必被包含在最終EXE文件中,EXE文件執行時可以”動態”地引用和卸載這個與EXE獨立的DLL文件。靜態鏈接庫和動態鏈接庫的另一個區別在於靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含其他的動態或靜態鏈接庫。
靜態鏈接庫
在VC++6.0中new一個名稱為lib的Win32 Static Library工程。並創建一個.h與.cpp的文件。比如(經典例子):
//文件:lib.h
#ifndef LIB_H
#define LIB_H
extern “C” int add(int x,int y);
#endif
//文件:lib.cpp
#include “lib.h”
int add(int x,int y)
{
return x+y;
}
編譯這個工程就會顯示一個界面,如下圖:
這時候,文件中的debug里就會多出一個.lib文件,這個文件就是一個函數庫,它提供了add的功能。將頭文件和.lib文件交給用戶,用戶就能直接使用里面的add函數了。
標准Turbo C2.0中的C庫函數(我們用的scanf、printf、memcpy、strcpy等就來自靜態庫)。
調用lib的時候可能會出現一些問題 最常見的就是LINK:fatal error LNK1104:cannot open file...,遇到這個需要上網搜索相關答案,還有一種方法(親自試過,沒有報錯):創建一個新的工程Win32 Console Application ,在該工程下創建兩個文件,比如abc.c與abc.h。並將上個工程生成的lib.lib與lib.h放到該工程目錄下。
//abc.h
#ifndef ABC_H
#define ABC_H
#pragma comment(lib,“lib.lib”);
#endif
//abc.c
#include <stdio.h>
#include “abc.h”
#inlcude “lib.h”
int main(int argc,char** argv)
{
printf(“2 + 3 = %d \n”,add(2,3));
return 0;
}
編譯運行,即可得到結果,靜態鏈接庫的調用就是這樣,或許我們每天都在用,可是沒有明白這個概念。代碼中#pragma comment(lib,”lib.lib”)的意思是指本文件生成的.obj應與lib.lib一起鏈接。
如果不用#pragma comment指定,也可以在VC++中設置,具體可以上網查下。
動態鏈接庫
動態鏈接庫的生成與調用與靜態鏈接庫還是有一點去別的。在VC++6.0 中可支持三種dll,分別是Non-MFC Dlls(非MFC dll)、Regular Dlls(MFC正規DLL)、Extension Dlls(MFC擴展DLL),在此,要說的是第一種,詳細了解可以問度娘。
在VC++6.0中new一個名稱為dll的Win32 Dynamic-Link Library工程。並創建一個.h與.cpp的文件。程序代碼如下:
//dll.h
#ifndef DLL_H
#define DLL_H
extern “C” int __declspec(dllexport)add(int x,int y);
#endif
//dll.cpp
#include “dll.h”
int add(int x,int y)
{
return x+y;
}
對程序進行編譯運行后同樣出現如圖:
此時在該工程的文件夾debug中生成了兩個鏈接庫,一個是dll.lib,一個是dll.dll。
將這兩個鏈接庫和頭文件一起交給用戶,用戶就能調用add函數。
調用dll可分為兩種方法,一種為純代碼,樣本如下:
#include <stdio.h>
#include <windows.h>
typedef int(*lpAddFun)(int, int); //宏定義函數指針類型
int main(int argc, char *argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函數指針
hDll = LoadLibrary("..\\Debug\\dll.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)
{
int result = addFun(2, 3);
printf("%d", result);
}
FreeLibrary(hDll);
}
return 0;
}
另一種方法就是在VC++6.0里設置,首先創建一個新的工程(Win32 Console Application),並且新建兩個文件.cpp與.h。
代碼基本沒有變化。主要是將dll.lib、dll.dll、dll.h放在該新建的工程中,dll.dll要放在該工程目錄下的debug中,然后在VC++6.0中右擊工程,選擇Add file to project,將dll.h添加進來,dll.lib與dll.h放在一起(也就是說,dll.h與dll.lib放在工程目錄下,dll.dll放在debug里);添加完成后,點擊Project->setting->Link->modules 在末尾添加dll.lib,點擊OK,編譯運行即可。