![]() |
程式庫目標是使用 lib
規則建立的,該規則遵循通用語法。例如:
lib helpers : helpers.cpp ;
這將定義一個名為 helpers
的程式庫目標,它由 helpers.cpp
原始程式碼檔案建置而成。它可以是靜態程式庫或共用程式庫,取決於 <link> 功能的值。
程式庫目標可以代表:
應該從原始碼建置的程式庫,如上例所示。
系統上已存在的預建程式庫。這些程式庫可以由使用它們的工具搜尋(通常使用連結器的 -l
選項),或者它們的路徑可以由建置系統預先知道。
預建程式庫的語法如下所示:
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
功能和使用 name
和 search
功能組合的區別在於 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 都存在,連結器可能會從同一個目錄中取得 a
和 b
,而不是在 /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 的撰寫。