CV_EXPORT定義的作用,lib及dll的區別

來源:互聯網
上載者:User

在core.hpp中,CV_EXPORT是出現頻率最高的詞之一。

1. CV_EXPORT是什麼。 有什麼用。

2. CV_EXPORT會涉及到dll的東西,那麼dll是什麼,lib與dll的區別是什麼。


CV_EXPORTS 出現的用法:

class CV_EXPORTS MatExpr;

template<typename _Tp> class CV_EXPORTS Size_;


CV_EXPORT的定義:

#if (defined WIN32 || defined WIN64) && defined CVAPI_EXPORTS
    #define CV_EXPORTS __declspec(dllexport)
#else
    #define CV_EXPORTS
#endif

實質上就是__declspec(dllexport)的定義:

msdn對其解釋:

http://msdn.microsoft.com/zh-cn/library/a90k134d(v=vs.80).aspx

在更新的編譯器版本中,可以使用 __declspec(dllexport) 關鍵字從 DLL 匯出資料、函數、類或類成員函數。

__declspec(dllexport) 會將匯出指令添加到對象檔案中,因此在指定的對象檔案裡您不需要使用 .def 檔案。當試圖匯出 C++ 修飾函數名時,這種便利最明顯。


若要匯出類中的所有公用資料成員和成員函數,關鍵字必須出現在類名的左邊。


其他概念:

動態連結程式庫中定義有兩種函數:匯出函數(export   function)和內建函式(internal   function)。 
匯出函數可以被其它模組調用,內建函式在定義它們的DLL程式內部使用。 

MFC提供的修飾符號_declspec(dllexport) 就是表示匯出函數或變數。

模組定義檔案(.DEF)是一個或多個用於描述DLL屬性的模組語句組成的文字檔。

----------------------------------------------------------


lib與dll的區別:

1. 使用方式有什麼不同。

2. 原因是什麼。


其實lib無論怎麼樣,都會用到。

一種是lib單獨使用,另外一種是lib+dll的方式(平時所說的dll的方式)。

lib單獨使用:

1. LIB包含函數代碼本身,不僅包含標頭檔,還有源碼,在編譯時間直接將代碼加入程式當中,稱為靜態連結庫static link library。連結產生的程式可以獨立運行。

    即lib檔案是靜態編譯出來的,索引和實現都在其中。

2. 同一機器,多個同種程式運行,每個程式都會載入一份程式碼程式庫。

3. 任何改動,都需要重新編譯、連結,這個對大型的程式非常不便,升級也麻煩。有時,在更改資料結構時,需要重新編譯整個工程,而非只編譯、連結單個lib。


lib+dll方式:

1. LIB包含了函數所在的DLL檔案和檔案中函數位置的資訊(入口),代碼由運行時載入在進程空間中的DLL提供,稱為動態連結程式庫dynamic link library。產生的程式需要dll配合使用。

    即lib一般是一些索引資訊,記錄了dll中函數的入口和位置,dll中是函數的具體內容。應用程式使用LIB檔案連結到DLL檔案。在應用程式的可執行檔中,存放的不是被調用的函數代碼,而是DLL中相應函數代碼的地址,從而節省了記憶體資源。

2. 多個程式運行,共用一份代碼。節省記憶體。

3. 當 DLL 中的函數發生更改時,只要函數的參數和傳回值沒有更改,就不需重新編譯或重新連結使用它們的應用程式。


使用方式的差別:

1. 靜態lib 需要.h和lib。 在產生lib時,相當於cpp編譯的obj的集合。連結時,指定lib的位置。
2. 動態lib 實質上是dll的使用方式。 在產生dll時,會產生一個lib,lib裡包含的是索引資訊。 編譯連結時,需要.h,lib。 運行時,需要程式和dll。

有關dll和lib的資訊還很多,暫時理解到這個層面吧。

msdn的連結:

http://msdn.microsoft.com/zh-cn/library/dtba4t8b(v=vs.80).aspx


runtime library如何選擇。

參考 http://blog.csdn.net/viewcode/article/details/8508211 多線程編程中的作業系統概念

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.