c++ 中動態鏈結庫--匯入和匯出的例項詳解
__declspec(dllexport)和__declspec(dllimport):
__declspec(dllexport):編譯器看到乙個變數、函式或者c++類被它修飾,那麼它就知道應該在生成的dll 模組中匯出該變數、函式或c++類。
__declspec(dllimport):編譯器看到乙個變數、函式或者c++類被它修飾,那麼它就知道可執行檔案或dll的原始檔需要從其它dll模組中匯入一些變數和函式。
dll的匯入段:
構建可執行模組時,可執行模組還可以包含乙個匯入段,其中列出了所有它需要的dll模組的名稱,對列出的每個dll,
該段還記錄了可執行檔案的二進位制**中引用的函程式設計客棧數和變數的www.cppcns.com符號名。dll中也有同樣的導www.cppcns.com入段,
記錄它所需要的模組名稱和函式、符號名。
dll檔案匯出段:
鏈結器生成dll的檔案中會嵌入乙個匯出符號表,這個匯出段列出了匯出的變數、函式和類的符號名。
extern "c"作用:
extern "c" 用來告訴編譯器不要對www.cppcns.com變數名或函式名進行改編,這樣c/c++或任何程式語言編寫的可執行模組都可以訪問該變數或函式。
建立相容dll:
c++支援函式過載,c語言不支援函式過載,c++編譯器會對函式名進行修改,而c語言則不會。
為了用microsoft工具包構建乙個能與其它編譯器廠商的工具包鏈結的dll,必須告訴編譯器不要對匯出的函式名進行改編。
可通過以下幾種方式實現:
1、extern "c" 修飾匯出函式、變數和類;
2、為專案建立乙個.def檔案;
library "dll-name.dll"
exports
func-name @ 1
.def檔案的規則為:
1> exports語句後列出要匯出函式的名稱,可以在.def檔案中的匯出函式名後加 @n,表示要匯出函式的序號為n;
2> .def檔案中的注釋由每個注釋行開始處的分號指定,且注釋不能與語句共享一行;
3、dll原始檔中加入:#pragma comment(linker, "/export:myfunc=_myfunc@8")
本文位址: /ruanjian/c/203873.html
C 動態鏈結庫
動態鏈結庫是實現共享函式庫概念的一種方式。擴充套件名為 dll 動態鏈結庫提供了一種方法,使程序可以呼叫不屬於其可執行 的函式。函式的可執行 位於乙個dll檔案中,該dll包含乙個或多個已被編譯,鏈結並與他們的程序分開儲存的函式。dll有助於共享資料和資源,多個應用程式可同時訪問記憶體中的單個dll...
C 動態鏈結庫
通過動態鏈結庫實現呼叫者不需要重新編譯的情況下被呼叫者的更改可生效 被呼叫者標頭檔案str.h ifndef str h define str h include include using namespace std class myclass a enum b static string fun...
C 動態鏈結庫
動態鏈結庫是實現共享函式庫概念的一種方式。擴充套件名為 dll 動態鏈結庫提供了一種方法,使程序可以呼叫不屬於其可執行 的函式。函式的可執行 位於乙個dll檔案中,該dll包含乙個或多個已被編譯,鏈結並與他們的程序分開儲存的函式。dll有助於共享資料和資源,多個應用程式可同時訪問記憶體中的單個dll...