OpenCV中的CV_EXPORT是什麼意思

LinJM-機器視覺發表於2016-04-17

今天在看OpenCV模板匹配的原始碼,發現,C/C++能力退化了不少,後期需要補課了。



在名的前面加了一個 CV_EXPORTS,覺得好奇怪,這是什麼東西,怎麼感覺以上在書本上都沒看到過。


首先,我們跟蹤程式碼,看看,CV_EXPORTS具體是什麼:




也就是說,CV_EXPORTS 實際上就是 __declspec(dllexport),查閱google可以發現,其作用如下:

        使用 __declspec(dllexport) 關鍵字從 DLL 匯出資料、函式、類或類成員函式。
        __declspec(dllexport) 會將匯出指令新增到物件檔案中,因此在指定的物件檔案裡您不需要使用 .def 檔案。

當試圖匯出 C++ 修飾函式名時,這種便利最明顯。由於對名稱修飾沒有標準規範,因此匯出函式的名稱在不同的編譯器版本中可能有所變化。如果使用 __declspec(dllexport),僅當解決任何命名約定更改時才必須重新編譯 DLL 和依賴 .exe 檔案。


若要匯出類中的所有公共資料成員和成員函式,關鍵字必須出現在類名的左邊。由於對名稱修飾沒有標準規範,因此匯出函式的名稱在不同的編譯器版本中可能有所變化。如果使用 __declspec(dllexport),僅當解決任何命名約定更改時才必須重新編譯 DLL 和依賴 .exe 檔案。


許多匯出指令(如序號、NONAME 和 PRIVATE)只能在 .def 檔案中建立,並且必須使用 .def 檔案來指定這些屬性。不過,在 .def 檔案的基礎上另外使用 __declspec(dllexport) 不會導致生成錯誤。


生成 DLL 時,通常建立一個包含正在匯出的函式原型和/或類的標頭檔案,並將 __declspec(dllexport) 新增到標頭檔案中的宣告中。若要提高程式碼的可讀性,請為 __declspec(dllexport) 定義一個巨集並對正在匯出的每個符號使用該巨集:

#define DllExport   __declspec( dllexport ) 

其他概念:
動態連結庫中定義有兩種函式:匯出函式(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。


REF:

http://blog.csdn.net/viewcode/article/details/8021989

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





相關文章