在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 多線程編程中的作業系統概念