動態鏈結庫的靜態匯入匯出

2021-05-23 06:00:01 字數 1486 閱讀 6785

【一】靜態匯入匯出

1.1 匯出

1.1.1__declspec(dllexport)關鍵字

在你需要匯出的資料或者函式前使用__declspec(dllexport)

eg: __declspec(dllexport) int woyaodaochu(int num) //ok 這個函式就是這個dll的匯出函式了。

eg: class __declspec(dllexport) woyaodaochu{}; //匯出類的所有公共成員和函式

可以匯出的東西包括 資料,函式,類,類成員函式(這句話也不盡對,特別是當類如c要匯入你的dll時,具體暫時我說不清楚,這裡留個標記)

__declspec(dllexport)被編譯器編譯時識別,在編譯器生成.obj檔案時會額外加入匯出資訊。鏈結器會在鏈結時獲取並處理這些資訊。

匯出符號表和rva都在生成的dll中。

1.1.2.def檔案(模組定義檔案)

這樣就不需要在要匯出的東西(資料,函式,類,類成員)前些__declspec(dllexport)關鍵字了。

如果使用vs,ide。可以在專案-屬性-鏈結器-輸入中修改該專案使用的def檔案。

msdn摘抄,免得辛苦再找(模組定義語句規則)

語句、屬性關鍵字和使用者指定的識別符號區分大小寫。

包含空格或分號 (;) 的長檔名必須用引號 (") 引起。

使用乙個或多個空格、製表符或換行符,將語句關鍵字同其引數分開和將各語句分開。指定引數的冒號 (:) 或等號 (=) 兩旁有零個或多個空格、製表符或換行符。

如果使用 name 或 library 語句,則這些語句必須位於所有其他語句之前。

在 .def 檔案中,sections 和 exports 語句可以出現多次。每個語句都可以採用多個規範,各規範間必須用乙個或多個空格、製表符或換行符分開。語句關鍵字必須在第乙個規範的前面出現一次,並且可以在每個附加規範的前面重複。

許多語句都具有等效的 link 命令列選項。有關其他詳細資訊,請參見相應的 link 選項說明。

.def 檔案中的注釋由每個注釋行開始處的分號 (;) 指定。注釋不能與語句共享一行,但可以在多行語句的規範間出現。((sections 和 exports 為多行語句。)

以十進位制或十六進製制為基礎指定數值引數。

如果字串引數與保留字匹配,則必須用雙引號 (") 將字串引數引起。

1.2 匯入

1.2.1__declspec(dllimport)關鍵字

在你需要匯入dll的專案中 用 __declspec(dllimport) 宣告匯入物件

eg: __declspec(dllimport) int woyaodaoru(int);

eg:class __declspec(dllimport) classname;

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...