Boost C++ Libraries

PrevUpHomeNext

程式庫

程式庫目標是使用 lib 規則建立的,該規則遵循通用語法。例如:

lib helpers : helpers.cpp ;

這將定義一個名為 helpers 的程式庫目標,它由 helpers.cpp 原始程式碼檔案建置而成。它可以是靜態程式庫或共用程式庫,取決於 <link> 功能的值。

程式庫目標可以代表:

預建程式庫的語法如下所示:

lib z : : <name>z <search>/home/ghost ;
lib compress : : <file>/opt/libs/compress.a ;

name 屬性指定程式庫的名稱,不包含標準的前綴和後綴。例如,根據系統的不同,z 可以指名為 z.so、libz.a 或 z.lib 等的檔案。search 功能指定除了預設編譯器路徑之外搜尋程式庫的路徑。search 可以指定多次,也可以省略,在這種情況下,只會搜尋預設的編譯器路徑。file 屬性指定檔案位置。

使用 file 功能和使用 namesearch 功能組合的區別在於 file 更精確。

警告

search 功能的值只會被添加到連結器搜尋路徑中。連結多個程式庫時,由 search 指定的路徑會被組合在一起,而不會考慮每個路徑來自哪個 lib 目標。因此,假設:

lib a : : <name>a <search>/pool/release ;
lib b : : <name>b <search>/pool/debug ;

如果 /pool/release/a.so、/pool/release/b.so、/pool/debug/a.so 和 /pool/release/b.so 都存在,連結器可能會從同一個目錄中取得 ab,而不是在 /pool/release 中找到 a,在 /pool/debug 中找到 b。如果您需要區分具有相同名稱的多個程式庫,使用 file 更安全。

為了方便起見,允許使用以下語法:

lib z ;
lib gui db aux ;

它的效果與以下語法完全相同:

lib z : : <name>z ;
lib gui : : <name>gui ;
lib db : : <name>db ;
lib aux : : <name>aux ;

當一個程式庫參考另一個程式庫時,您應該將另一個程式庫放在其來源列表中。這在所有情況下都能達到預期效果。為了可攜性,即使是搜尋到的和預建的程式庫,您也應該指定程式庫依賴關係,否則,Unix 上的靜態連結將無法正常工作。例如:

lib z ;
lib png : z : <name>png ;

注意事項

當一個程式庫的來源是一個共用程式庫,或者一個靜態程式庫的來源是另一個靜態程式庫時,任何連結到第一個程式庫的目標也會自動連結到其來源程式庫。

另一方面,當一個共用程式庫的來源是一個靜態程式庫時,第一個程式庫將被建置,使其完全包含第二個程式庫。

如果您不希望共用程式庫包含其來源中指定的所有程式庫(尤其是靜態連結的程式庫),您需要使用以下方法:

lib b : a.cpp ;
lib a : a.cpp : <use>b : : <library>b ;

這指定程式庫 a 使用程式庫 b,並使所有連結到 a 的可執行檔也連結到 b。在這種情況下,即使是共用連結,a 程式庫也不會參考 b

使用需求(宣告目標)通常對於定義程式庫目標非常有用。例如,假設您要建置一個名為 helpers 的程式庫,其介面定義在 helpers.hpp 標頭檔中,該檔案與 helpers.cpp 原始程式檔位於同一目錄。那麼您可以將以下內容添加到位於同一目錄的 Jamfile 中

lib helpers : helpers.cpp : : : <include>. ;

這將會自動把定義目標的目錄(也是程式庫標頭檔所在的目錄)添加到所有使用 helpers 程式庫的目標的編譯器 include 路徑中。這個功能大大簡化了 Jamfiles 的撰寫。


PrevUpHomeNext