靜态lib檔案
靜态lib檔案實際上就是任意個obj檔案的集合,而obj檔案就是cpp檔案編譯之後産生的一種檔案,一個cpp檔案編譯之後隻會産生一個obj檔案,而多個obj檔案就可以連接配接生成lib檔案。
靜态lib檔案實際上是包含了所有的導出聲明和實作。你如果把這個lib檔案連結到自己的程式之後,這個lib檔案中的所有代碼都會嵌入進來,哪怕你隻用到了其中一部分,剩下沒用到的也進了你的代碼。自然會導緻你的庫體積沒有意義地變大,失去了使用動态庫的靈活性,而且釋出新的版本時必須要釋出新的應用程式才行,而不是簡單打個更新檔就好。就是因為這種缺點,才會出現動态dll調用這種方式。
動态lib檔案和dll檔案
一個dll工程生成一個dll檔案的時候,總是伴随着生成一個lib檔案,這個lib檔案其實是一個動态的lib,它的大小比靜态lib要小很多,因為這個lib檔案其實隻是包含了一些函數索引資訊,記錄了dll中那些函數的入口和位置,dll中才是具體的函數實作。那麼為什麼有了dll,還要有一個lib呢?
這就是動态庫連結的過程了,首先配置好動态lib庫目錄和動态dll目錄,以及頭檔案的目錄。然後在你的代碼中include用到的頭檔案,代碼完成之後有兩個過程:(1)編譯:這個過程隻需要用到這裡的動态lib檔案【注:在靜态lib的情況下,仍然隻是在編譯階段用到lib檔案,隻不過靜态lib檔案包含了完整的實作,是以編譯生成exe之後就可以直接用了而已】,然後和你的代碼打包到一起。(2)運作:這個過程就需要用到dll檔案了,上面打包好的東西裡面,隻是記錄下了那些用到的函數的入口和具體位置,并沒有真正的實作代碼,是以在運作期間,就由那些入口找到正确的位于dll中的位置,然後直接執行那些函數就行了。
dll其實就是exe,隻不過它沒有main函數,是以不能單獨執行而已。事實上, 在實際的使用過程中我們也發現,很多應用程式都并不是一個完整的單獨可執行檔案,它們被分割成一些單獨的相對對立的動态連結庫,隻有在執行應用程式的時候,用到的dll才會被調用。