![]() |
程式庫可以是靜態的,表示它們會包含在使用它們的可執行檔中,也可以是共享的(又稱為動態的),表示它們只會被可執行檔參考,並且必須在執行時期可用。Boost.Build 可以建立和使用這兩種程式庫。
從 lib
目標產生的程式庫類型由 link
特性的值決定。預設值是 shared
,若要建置靜態程式庫,值應為 static
。您可以在命令列上要求靜態建置
b2 link=static
或在程式庫的需求中
lib l : l.cpp : <link>static ;
我們也可以使用 <link>
屬性來表達每個目標的連結需求。例如,如果某個可執行檔只能使用程式庫的靜態版本正確建置,我們可以限定可執行檔對程式庫的目標參考,如下所示
exe important : main.cpp helpers/<link>static ;
無論在 b2 命令列上指定了哪些參數,important
都只會與 helpers
的靜態版本連結。
在目標參考中指定屬性尤其有用,如果您使用在其他專案(您無法更改的專案)中定義的程式庫,但您仍然希望在所有情況下都靜態(或動態)連結到該程式庫。如果許多目標都使用該程式庫,您可以在任何地方都使用目標參考
exe e1 : e1.cpp /other_project//bar/<link>static ; exe e10 : e10.cpp /other_project//bar/<link>static ;
但這很不方便。更好的方法是引入一個間接層。建立一個本地的 alias 目標,它參考 foo
的靜態(或動態)版本
alias foo : /other_project//bar/<link>static ; exe e1 : e1.cpp foo ; exe e10 : e10.cpp foo ;
alias 規則專門用於重新命名目標的參考,並可能更改屬性。
當一個程式庫使用另一個程式庫時,您將第二個程式庫放在第一個程式庫的來源列表中。例如
lib utils : utils.cpp /boost/filesystem//fs ; lib core : core.cpp utils ; exe app : app.cpp core ;
無論使用哪種連結方式,這都有效。當 core
建置為共享程式庫時,它會直接連結到 utils
。靜態程式庫不能連結到其他程式庫,因此當 core
建置為靜態程式庫時,它對 utils
的依賴性會傳遞給 core
的依賴項,導致 app
與 core
和 utils
連結。
(非 UNIX 系統的注意事項)。通常,共享程式庫必須安裝到動態連結器的搜尋路徑中的目錄。否則,使用共享程式庫的應用程式將無法啟動。在 Windows 上,動態連結器的搜尋路徑由 PATH
環境變數指定。當您使用 Boost.Build 測試工具時,此限制將被解除——在執行可執行檔之前,PATH
變數將會自動調整。