dll是在你的程序運(yùn)行的時候才連接的文件,因此它是一種比較小的可執(zhí)行文件格式,.dll還有其他的文件格式如.ocx等,所有的.dll文件都是可執(zhí)行;
1. 包含一個對應(yīng)的頭文件告知編譯器lib文件里面的具體內(nèi)容
2 .設(shè)置lib文件允許編譯器去查找已經(jīng)編譯好的二進(jìn)制代碼
extern "C"
{
#include "myheader.h"
}
這是因?yàn)镃語言寫的lib文件沒有C++所必須的名字破壞,C函數(shù)不能被重載,因此連接器會出錯。
在VC中不用MFC如何制作dll
方法一:使用export 和 import
在VC中建立一個Console Application,建立2個文件:Dll.h 和 Dll.cpp
Dll.h
========================================================
#ifdef MYLIBAPI
#else
#define MYLIBAPI extern "C" _declspec (dllimport)
#end if
MYLIBAPI int Add (int iLeft, int iRight)
MYLIBAPI int Sub (int iLeft, int iRight)
========================================================
Dll.cpp
========================================================
#define MYLIBAPI extern "C" _declspec (dllexport)
#include "Dll.h"
int Add (int iLeft, int iRight)
{
return iLeft + iRight ;
}
int Sub (int iLeft, int iRight)
{
return iLeft - iRight ;
}
========================================================
保存文件。在Project->setting->link 最下面加上 “/dll”, "/"之前一定要與前一項(xiàng)有空格。然后編譯,就可以在debug 或 release下面找到dll 和 lib 文件了使用的時候包含dll.h文件。
方法二:使用def文件
建立一個console application, 建立2個文件dll.h 和 dll.cpp
Dll.h
========================================================
int Add (int iLeft, int iRight) ;
int Sub (int iLeft, int iRight) ;
========================================================
Dll.cpp
========================================================
#include "Dll.h"
int Add (int iLeft, int iRight)
{
return iLeft + iRight ;
}
int Sub (int iLeft, int iRight)
{
return iLeft - iRight ;
}
========================================================
然后再當(dāng)前目錄下面建立一個.def文件,文件名最好和要輸出的dll名字一樣,擴(kuò)展名為.def, 里面寫上:
LIBRARY dllname.dll
EXPORTS
Add @1
Add @2
然后將這個文件添加到工程中,在link中設(shè)置 /dll, 然后編譯在debug或release中就可以找到dll和lib了
使用的時候加上dll.h文件。
===============================
補(bǔ)充一點(diǎn):
做成靜態(tài)庫可執(zhí)行文件本身比較大,但不必附帶動態(tài)庫
做成動態(tài)庫可執(zhí)行文件本身比較小,但需要附帶動態(tài)庫
其它沒有什么對于程序員而言很大的區(qū)別,有的Unix可能不支持動態(tài)庫,所以只好用靜態(tài)庫。
DLL與LIB的區(qū)別:
1.DLL是一個完整程序,其已經(jīng)經(jīng)過鏈接,即不存在同名引用,且有導(dǎo)出表,與導(dǎo)入表lib是一個代碼集(也叫函數(shù)集)他沒有鏈接,所以lib有冗余,當(dāng)兩個lib相鏈接時地址會重新建立,當(dāng)然還有其它相關(guān)的不同,用lib.exe就知道了;
2.在生成dll時,經(jīng)常會生成一個.lib(導(dǎo)入與導(dǎo)出),這個lib實(shí)際上不是真正的函數(shù)集,其每一個導(dǎo)出導(dǎo)入函數(shù)都是跳轉(zhuǎn)指令,直接跳轉(zhuǎn)到DLL中的位置,這個目的是外面的程序調(diào)用dll時自動跳轉(zhuǎn);
3.實(shí)際上最常用的lib是由lib.exe把*.obj生成的lib。