在PCL庫的point_types.hpp中,PCL_EXPORT是出現頻率最高的詞之一。
1. PCL_EXPORT是什麼? 有什麼用?
2. PCL_EXPORT會涉及到dll的東西,那麼dll是什麼,lib與dll的區別是什麼?
PCL_EXPORTS 出現的用法:
PCL_EXPORTS std::ostream& operator << (std::ostream& os, const PointXYZ& p);
class PCL_EXPORTS AreaPickingEvent{……}
PCL_EXPORT的定義:
#if defined WIN32 || defined _WIN32 || defined WINCE || defined __MINGW32__
#ifdef PCLAPI_EXPORTS
#define PCL_EXPORTS __declspec(dllexport)
#else
#define PCL_EXPORTS
#endif
#else
#define PCL_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 多線程編程中的操作系統概念