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

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章