2017-01-23 61 views
-2

我理解僅頭標庫,動態鏈接庫(意味着共享對象的.so文件)和靜態庫(.a,如檔案文件)之間的區別。Boost庫類型

無論如何,我不完全理解的是:爲什麼有Boost庫必須預編譯並動態鏈接(.so文件)以及只能與其頭文件一起使用的庫?什麼是需要動態鏈接的原因?請儘可能具體和詳細。 :)

問候, 索爾特

+1

據我所知,使用_any_預編譯的庫沒有它的頭文件是不可能的。 '.a'靜態庫也是如此。您可以使用動態庫來減少(有時極大地)可執行文件的大小,因爲這些庫是獨立分發的,並且可以在客戶端的計算機上安裝_already_。所以,你只發布你的程序,但用戶必須在必要時自己獲取這些庫。 – ForceBru

回答

1

在很大程度上,這是一個優化。這裏有一些原因,你就會把至少部分的資料庫的代碼放到一個單獨建庫文件(如共享對象),而不是隻用頭:

  1. 您可能需要它必須是一個全局變量存儲在某個地方 - 最簡單的地方放在你自己的編譯對象中。
  2. 您的庫的客戶端需要通過「外部函數接口」(FFI)使用它,該函數通常基於dlopen(),因此需要編譯代碼而不是頭文件(許多FFI無法讀取)。
  3. 您的代碼的大小很大,可能包含一個或多個大函數。只編譯一次通常會節省編譯時間和可執行文件大小。
  4. 您希望運送源代碼中不可見的代碼,例如:扼殺逆向工程或徹底盜竊您的代碼。