C / C++ 規則

回報問題 查看原始碼 Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

規則

cc_binary

查看規則來源
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

隱含輸出目標

  • name.stripped (僅在明確要求時建構):二進位檔的去除版本。strip -g 會在二進位檔上執行,以移除偵錯符號。您可以使用 --stripopt=-foo 在指令列上提供其他去除選項。只有在明確要求時才會建構此輸出內容。
  • name.dwp (僅在明確要求時才建構):如果已啟用 Fission:偵錯資訊套件檔案,適合用於偵錯遠端部署的二進位檔。否則:空白檔案。

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

deps

標籤清單;預設為 []

要連結至二進位目標的其他程式庫清單。

這些可以是 cc_libraryobjc_library 目標。

srcs

標籤清單;預設為 []

系統在建立目標時,會處理的 C 和 C++ 檔案清單。這些是 C/C++ 來源和標頭檔案,可能是未產生的 (一般來源程式碼) 或已產生的。

所有 .cc.c.cpp 檔案都會編譯。這些可能是產生的檔案:如果某個已命名的檔案位於其他規則的 outs 中,這個規則就會自動依附該規則。

系統不會編譯 .h 檔案,但可供此規則中的來源加入。.cc.h 檔案都能直接納入這些 srcs 中列出的標頭,或是 deps 引數中列出的任何規則的 hdrs

所有已 #include 的檔案都必須在這個規則的 srcs 屬性中提及,或是在參照的 cc_library()hdrs 屬性中提及。建議的樣式是將與程式庫相關聯的標頭列在該程式庫的 hdrs 屬性中,並將與此規則來源相關聯的任何其他標頭列在 srcs 中。詳情請參閱「"標頭包含檢查"

如果規則名稱位於 srcs 中,則此規則會自動依附該規則。如果命名規則的 outs 是 C 或 C++ 來源檔案,則會編譯至此規則;如果是程式庫檔案,則會連結進來。

允許的 srcs 檔案類型:

  • C 和 C++ 來源檔案:.c.cc.cpp.cxx.c++.C
  • C 和 C++ 標頭檔案:.h.hh.hpp.hxx.inc.inl.H
  • 使用 C 前置處理器的組譯器:.S
  • 封存:.a.pic.a
  • 「一律連結」程式庫:.lo.pic.lo
  • 共用資料庫 (已分版本或未分版本):.so.so.version
  • 物件檔案:.o.pic.o

...以及產生這些檔案的任何規則。 根據 gcc 慣例,不同的擴充功能代表不同的程式設計語言。

additional_linker_inputs

標籤清單;預設為 []

將這些檔案傳遞至 C++ 連結器指令。

例如,您可以在此提供已編譯的 Windows .res 檔案,以便嵌入二進位目標。

copts

字串清單;預設為 []

將這些選項新增至 C++ 編譯指令。適用於「Make 變數」替換和 Bourne shell 符記化

在編譯二進位目標之前,這個屬性中的每個字串都會依照指定順序新增至 COPTS。標記只會影響此目標的編譯作業,而非其依附元件,因此請留意其他地方是否包含標頭檔案。所有路徑都應以工作區為基準,而非目前套件。

如果套件宣告功能 no_copts_tokenization,Bourne shell 符記化只會套用至由單一「Make」變數組成的字串。

defines

字串清單;預設為 []

要新增至編譯行中的定義清單。適用於「Make」變數替換和 Bourne shell 符記化。每個字串都必須包含單一 Bourne 殼層符記,並在開頭加上 -D,然後新增至此目標的編譯指令行,以及依附於此目標的每個規則。請務必謹慎操作,因為這可能會造成廣泛的影響。如有疑問,請改為將定義值新增至 local_defines
includes

字串清單;預設為 []

要新增至編譯行中的包含目錄清單。

適用於 "Make 變數" 替換。 每個字串都會在開頭加上 -isystem,並新增至 COPTS。與 COPTS 不同,這些標記會新增至此規則和依附於此規則的每個規則。(注意:不是依附的規則!)請務必謹慎操作,因為這可能會造成廣泛的影響。如有疑問,請改為在 COPTS 中加入「-I」標記。

標頭必須新增至 srcs 或 hdrs,否則在編譯處於沙箱狀態 (預設) 時,依附的規則將無法使用標頭。

標籤;預設為 "@bazel_tools//tools/cpp:link_extra_lib"

控制額外程式庫的連結。

根據預設,C++ 二進位檔會連結至 //tools/cpp:link_extra_lib,而 //tools/cpp:link_extra_lib 預設會依附標籤標記 //tools/cpp:link_extra_libs。如果未設定標記,這個程式庫預設為空白。設定標籤標記可連結選用依附元件,例如弱式符號的覆寫值、共用程式庫函式的攔截器,或特殊執行階段程式庫 (針對 malloc 替換,請優先使用 malloc--custom_malloc)。將此屬性設為 None 會停用這項行為。

linkopts

字串清單;預設為 []

將這些標記新增至 C++ 連結器指令。適用於 "Make" 變數替換、 Bourne 殼層符記代碼化標籤展開。這個屬性中的每個字串都會在連結二進位目標之前新增至 LINKOPTS

清單中每個元素的開頭不是 $-,則會假設為 deps 中目標的標籤。該目標產生的檔案清單會附加至連結器選項。如果標籤無效,或未在 deps 中宣告,系統會回報錯誤。

linkshared

布林值;不可設定;預設值為 False

建立共用程式庫。 如要啟用這項屬性,請在規則中加入 linkshared=True。這個選項預設為關閉。

這個標記的存在表示連結會將 -shared 標記連結至 gcc,而產生的共用程式庫則適合載入至 Java 程式等。不過,為了建構目的,這項規則永遠不會連結至依附的二進位檔,因為系統會假設使用 cc_binary 規則建構的共用程式庫只能由其他程式手動載入,因此這項規則不應視為 cc_library 規則的替代方案。為了提升可擴充性,建議您完全避免採用這種做法,而是讓 java_library 依附 cc_library 規則。

如果您同時指定 linkopts=['-static']linkshared=True,您將獲得一個完全獨立的單元。如果您同時指定 linkstatic=Truelinkshared=True,您會得到一個幾乎自給自足的單一單位。

linkstatic

布林值;預設值為 True

針對 cc_binarycc_test:在靜態模式中連結二進位檔。如為 cc_library.linkstatic:請參閱下方說明。

根據預設,這個選項會為 cc_binary 開啟,並為其他選項關閉。

如果已啟用,且這是二進位檔或測試,這個選項會指示建構工具盡可能連結 .a 而非 .so 的使用者程式庫。部分系統程式庫仍可能會以動態方式連結,而沒有靜態資料庫的程式庫也是如此。因此產生的可執行檔仍會以動態方式連結,因此只有「大部分」是靜態的。

實際上有三種不同的方式可以連結可執行檔:

  • 使用 fully_static_link 功能的 STATIC,其中所有項目都會以靜態方式連結,例如「gcc -static foo.o libbar.a libbaz.a -lm」。
    如要啟用這個模式,請在 features 屬性中指定 fully_static_link
  • STATIC,其中所有使用者程式庫會以靜態方式連結 (如果有靜態版本),但系統程式庫 (不含 C/C++ 執行階段程式庫) 會以動態方式連結,例如「gcc foo.o libfoo.a libbaz.a -lm」。
    如要啟用此模式,請指定 linkstatic=True
  • DYNAMIC,所有程式庫都會動態連結 (如果有動態版本),例如「gcc foo.o libfoo.so libbaz.so -lm」。
    如要啟用這個模式,請指定 linkstatic=False

如果 linkstatic 屬性用於 cc_library() 規則,其含義就會有所不同。對於 C++ 程式庫,linkstatic=True 表示只允許靜態連結,因此不會產生 .so。linkstatic=False 不會阻止建立靜態資料庫。這個屬性用於控制動態程式庫的建立作業。

如果是 linkstatic=False,則建構工具會在 *.runfiles 區域中建立指向依附共用程式庫的符號連結。

local_defines

字串清單;預設為 []

要新增至編譯行中的定義清單。適用於「Make」變數替換和 Bourne shell 符記化。每個字串都必須包含一個 Bourne shell 符記,並在開頭加上 -D,然後加入這個目標的編譯指令行,但不加入其依附項目。
malloc

標籤;預設為 "@bazel_tools//tools/cpp:malloc"

覆寫對 malloc 的預設依附元件。

根據預設,C++ 二進位檔會連結至 //tools/cpp:malloc,這是空白程式庫,因此二進位檔會使用 libc malloc。這個標籤必須參照 cc_library。如果編譯作業是針對非 C++ 規則,這個選項就不會生效。如果指定 linkshared=True,系統會忽略此屬性的值。

nocopts

字串;預設為 ""

從 C++ 編譯指令中移除相符的選項。適用於 "Make" 變數替換。 系統會將此屬性的值解讀為規則運算式。為了編譯此規則,系統會從 COPTS 中移除任何符合此規則運算式的先前 COPTS (包括規則 copts 屬性中明確指定的值)。這項屬性應該很少需要。
stamp

整數;預設值為 -1

是否將建構資訊編碼至二進位檔。可能的值包括:
  • stamp = 1:一律將建構資訊戳記到二進位檔案中,即使是在 --nostamp 版本中也是如此。請避免使用這項設定,因為這可能會導致二進位檔和任何依賴二進位檔的後續動作無法進行遠端快取。
  • stamp = 0:一律使用常數值取代建構資訊。這可提供良好的建構結果快取功能。
  • stamp = -1:版本資訊的嵌入方式由 --[no]stamp 標記控制。

除非依附元件變更,否則系統不會重新建構經過標記的二進位檔。

win_def_file

標籤;預設為 None

要傳遞至連結器的 Windows DEF 檔案。

只有在 Windows 是目標平台時,才應使用這個屬性。在連結共用程式庫時,可用來 匯出符號

cc_import

查看規則來源
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)

cc_import 規則可讓使用者匯入預先編譯的 C/C++ 程式庫。

以下是常見用途:
1. 連結靜態資料庫

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = 1,
)
2. 連結共用程式庫 (Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. 將共用程式庫連結至介面程式庫 (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4. 使用 system_provided=True 連結共用程式庫 (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = 1,
)
5. 連結至靜態或共用程式庫
在 Unix 上:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

# first will link to libmylib.a
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to libmylib.so
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
Windows:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.lib", # A normal static library
  interface_library = "mylib.lib", # An import library for mylib.dll
  shared_library = "mylib.dll",
)

# first will link to libmylib.lib
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to mylib.dll through mylib.lib
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
cc_import 支援 include 屬性。例如:
  cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = [ "vendor/curl/include" ],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

deps

標籤清單;預設為 []

目標依附的其他程式庫清單。如要查看 deps 的一般註解,請參閱「大部分建構規則定義的常見屬性」。
hdrs

標籤清單;預設為 []

這個預先編譯程式庫發布的標頭檔案清單,可由依附規則中的來源直接納入。

布林值;預設值為 False

如果為 1,則任何直接或間接依賴此 C++ 預先編譯程式庫的二進位檔,都會連結靜態資料庫中封存的所有物件檔案,即使其中有些檔案不含二進位檔參照的符號也一樣。如果二進位檔中的程式碼並未明確呼叫您的程式碼,例如您的程式碼註冊來接收某些服務提供的回呼,這項功能就很實用。

如果 alwayslink 無法在 Windows 上與 VS 2017 搭配運作,可能是因為已知問題,請將 VS 2017 升級至最新版本。

interface_library

標籤;預設為 None

用於連結共用程式庫的單一介面程式庫。

允許的檔案類型: .ifso.tbd.lib.so.dylib

shared_library

標籤;預設為 None

單一預編譯共用程式庫。Bazel 會確保在執行階段,依附元件可供依附元件所需的二進位檔使用。

允許的檔案類型:.so.dll.dylib

static_library

標籤;預設為 None

單一預先編譯的靜態資料庫。

允許的檔案類型:.a.pic.a.lib

system_provided

布林值;預設值為 False

如果為 1,表示系統會提供執行階段所需的共用資料庫。在這種情況下,應指定 interface_library,而 shared_library 應留空。

cc_library

查看規則來源
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

標頭納入檢查

在建構中使用的所有標頭檔案,都必須在 cc_* 規則的 hdrssrcs 中宣告。這項規定是強制執行的。

對於 cc_library 規則,hdrs 中的標頭包含程式庫的公開介面,可直接從 hdrs 和程式庫本身的 srcs 檔案,以及 cc_* 規則的 hdrssrcs 檔案中,列出程式庫的 deps 中直接納入。srcs 中的標頭只能直接從資料庫本身的 hdrssrcs 檔案中加入。決定是否要將標頭放入 hdrssrcs 時,請考慮是否要讓這個程式庫的使用者能夠直接加入標頭。這與在程式語言中使用 publicprivate 可見性時做出的決定大致相同。

cc_binarycc_test 規則沒有匯出的介面,因此也沒有 hdrs 屬性。所有直接屬於二進位檔或測試的標頭,都應列在 srcs 中。

以下範例說明這些規則。

cc_binary(
    name = "foo",
    srcs = [
        "foo.cc",
        "foo.h",
    ],
    deps = [":bar"],
)

cc_library(
    name = "bar",
    srcs = [
        "bar.cc",
        "bar-impl.h",
    ],
    hdrs = ["bar.h"],
    deps = [":baz"],
)

cc_library(
    name = "baz",
    srcs = [
        "baz.cc",
        "baz-impl.h",
    ],
    hdrs = ["baz.h"],
)

下表列出此範例中允許的直接包含項目。舉例來說,foo.cc 可以直接包含 foo.hbar.h,但不能包含 baz.h

包含檔案允許納入的內容
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

納入檢查規則僅適用於直接納入內容。在上述範例中,foo.cc 可包含 bar.h,而 bar.h 可包含 baz.hbaz.h 則可包含 baz-impl.h。從技術層面來說,編譯 .cc 檔案時,可能會透過 deps 閉包中的 cc_libraryhdrssrcs 中的任何標頭檔案納入。在這種情況下,編譯器在編譯 foo.cc 時可能會讀取 baz.hbaz-impl.h,但 foo.cc 不得包含 #include "baz.h"。為允許這項操作,baz 必須新增至 foodeps

Bazel 會依賴工具鍊支援功能來強制執行包含檢查規則。工具鍊必須支援 layering_check 功能,並明確要求此功能,例如透過 --features=layering_check 指令列旗標或 package 函式的 features 參數。Bazel 提供的工具鍊僅支援在 Unix 和 macOS 上使用 clang 執行這項功能。

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

deps

標籤清單;預設為 []

要連結至二進位目標的其他程式庫清單。

這些可以是 cc_libraryobjc_library 目標。

srcs

標籤清單;預設為 []

系統在建立目標時,會處理的 C 和 C++ 檔案清單。這些是 C/C++ 來源和標頭檔案,可能是未產生的 (一般來源程式碼) 或已產生的。

所有 .cc.c.cpp 檔案都會編譯。這些可能是產生的檔案:如果某個已命名的檔案位於其他規則的 outs 中,這個規則就會自動依附該規則。

系統不會編譯 .h 檔案,但可供此規則中的來源加入。.cc.h 檔案都能直接納入這些 srcs 中列出的標頭,或是 deps 引數中列出的任何規則的 hdrs

所有已 #include 的檔案都必須在這個規則的 srcs 屬性中提及,或是在參照的 cc_library()hdrs 屬性中提及。建議的樣式是將與程式庫相關聯的標頭列在該程式庫的 hdrs 屬性中,並將與此規則來源相關聯的任何其他標頭列在 srcs 中。詳情請參閱「"標頭包含檢查"

如果規則名稱位於 srcs 中,則此規則會自動依附該規則。如果命名規則的 outs 是 C 或 C++ 來源檔案,則會編譯至此規則;如果是程式庫檔案,則會連結進來。

允許的 srcs 檔案類型:

  • C 和 C++ 來源檔案:.c.cc.cpp.cxx.c++.C
  • C 和 C++ 標頭檔案:.h.hh.hpp.hxx.inc.inl.H
  • 使用 C 前置處理器的組譯器:.S
  • 封存:.a.pic.a
  • 「一律連結」程式庫:.lo.pic.lo
  • 共用資料庫 (已分版本或未分版本):.so.so.version
  • 物件檔案:.o.pic.o

...以及產生這些檔案的任何規則。 根據 gcc 慣例,不同的擴充功能代表不同的程式設計語言。

hdrs

標籤清單;預設為 []

此程式庫發布的標頭檔案清單,可由依附規則中的來源直接納入。

這是宣告描述程式庫介面的標頭檔案的首選位置。這些標頭會開放給這項規則或相關規則中的來源加入。即使已在發布的標頭中納入,如果這個程式庫的用戶端不應納入標頭,則應改為在 srcs 屬性中列出標頭。詳情請參閱「"Header inclusion checking"

additional_compiler_inputs

標籤清單;預設為 []

您可能想傳遞至編譯器指令列的任何其他檔案,例如清單的消毒劑忽略項目。您可以使用 $(location) 函式,在 copts 中使用此處指定的檔案。
additional_linker_inputs

標籤清單;預設為 []

將這些檔案傳遞至 C++ 連結器指令。

例如,您可以在此提供已編譯的 Windows .res 檔案,以便嵌入二進位目標。

布林值;預設值為 False

如果為 1,則任何直接或間接依賴此 C++ 程式庫的二進位檔案,都會連結 srcs 中列出的所有物件檔案,即使其中有些檔案不含二進位檔案參照的符號也一樣。如果二進位檔中的程式碼並未明確呼叫您的程式碼,例如您的程式碼註冊來接收某些服務提供的回呼,這項功能就很實用。

如果 alwayslink 無法在 Windows 上與 VS 2017 搭配運作,可能是因為已知問題,請將 VS 2017 升級至最新版本。

copts

字串清單;預設為 []

將這些選項新增至 C++ 編譯指令。適用於「Make 變數」替換和 Bourne shell 符記化

在編譯二進位目標之前,這個屬性中的每個字串都會依照指定順序新增至 COPTS。標記只會影響此目標的編譯作業,而非其依附元件,因此請留意其他地方是否包含標頭檔案。所有路徑都應以工作區為基準,而非目前套件。

如果套件宣告功能 no_copts_tokenization,Bourne shell 符記化只會套用至由單一「Make」變數組成的字串。

defines

字串清單;預設為 []

要新增至編譯行中的定義清單。適用於「Make」變數替換和 Bourne shell 符記化。每個字串都必須包含單一 Bourne 殼層符記,並在開頭加上 -D,然後新增至此目標的編譯指令行,以及依附於此目標的每個規則。請務必謹慎操作,因為這可能會造成廣泛的影響。如有疑問,請改為將定義值新增至 local_defines
implementation_deps

標籤清單;預設為 []

程式庫目標依附的其他程式庫清單。與 deps 不同,這些程式庫的標頭和包含路徑 (以及所有傳遞依附元件) 只用於編譯這個程式庫,而非依附於此程式庫的程式庫。使用 implementation_deps 指定的程式庫,仍會連結至依附此程式庫的二進位目標。

目前僅限於 cc_libraries 使用,並由標記 --experimental_cc_implementation_deps 保護。

include_prefix

字串;預設為 ""

要新增至此規則標頭路徑的前置字串。

設定後,您可以在該規則的 hdrs 屬性中存取標頭,該屬性值會附加至相對於存放區的路徑。

系統會先移除 strip_include_prefix 屬性中的前置字串,再新增這個前置字串。

includes

字串清單;預設為 []

要新增至編譯行中的包含目錄清單。

適用於 "Make 變數" 替換。 每個字串都會在開頭加上 -isystem,並新增至 COPTS。與 COPTS 不同,這些標記會新增至此規則和依附於此規則的每個規則。(注意:不是依附的規則!)請務必謹慎操作,因為這可能會造成廣泛的影響。如有疑問,請改為在 COPTS 中加入「-I」標記。

標頭必須新增至 srcs 或 hdrs,否則在編譯處於沙箱狀態 (預設) 時,依附的規則將無法使用標頭。

linkopts

字串清單;預設為 []

將這些標記新增至 C++ 連結器指令。適用於 "Make" 變數替換、 Bourne 殼層符記代碼化標籤展開。這個屬性中的每個字串都會在連結二進位目標之前新增至 LINKOPTS

清單中每個元素的開頭不是 $-,則會假設為 deps 中目標的標籤。該目標產生的檔案清單會附加至連結器選項。如果標籤無效,或未在 deps 中宣告,系統會回報錯誤。

linkstamp

標籤;預設為 None

同時將指定的 C++ 來源檔案編譯及連結至最終二進位檔。您必須使用這種技巧,才能將時間戳記資訊加入二進位檔;如果我們以一般方式將來源檔案編譯為物件檔案,時間戳記就會不正確。連結標記編譯作業可能不包含任何特定的編譯器旗標組合,因此不應依賴任何特定的標頭、編譯器選項或其他建構變數。這個選項僅適用於 base 套件。
linkstatic

布林值;預設值為 False

針對 cc_binarycc_test:在靜態模式中連結二進位檔。如為 cc_library.linkstatic:請參閱下方說明。

根據預設,這個選項會為 cc_binary 開啟,並為其他選項關閉。

如果已啟用,且這是二進位檔或測試,這個選項會指示建構工具盡可能連結 .a 而非 .so 的使用者程式庫。部分系統程式庫仍可能會以動態方式連結,而沒有靜態資料庫的程式庫也是如此。因此產生的可執行檔仍會以動態方式連結,因此只有「大部分」是靜態的。

實際上有三種不同的方式可以連結可執行檔:

  • 使用 fully_static_link 功能的 STATIC,其中所有項目都會以靜態方式連結,例如「gcc -static foo.o libbar.a libbaz.a -lm」。
    如要啟用這個模式,請在 features 屬性中指定 fully_static_link
  • STATIC,其中所有使用者程式庫會以靜態方式連結 (如果有靜態版本),但系統程式庫 (不含 C/C++ 執行階段程式庫) 會以動態方式連結,例如「gcc foo.o libfoo.a libbaz.a -lm」。
    如要啟用此模式,請指定 linkstatic=True
  • DYNAMIC,所有程式庫都會動態連結 (如果有動態版本),例如「gcc foo.o libfoo.so libbaz.so -lm」。
    如要啟用這個模式,請指定 linkstatic=False

如果 linkstatic 屬性用於 cc_library() 規則,其含義就會有所不同。對於 C++ 程式庫,linkstatic=True 表示只允許靜態連結,因此不會產生 .so。linkstatic=False 不會阻止建立靜態資料庫。這個屬性用於控制動態程式庫的建立作業。

如果是 linkstatic=False,則建構工具會在 *.runfiles 區域中建立指向依附共用程式庫的符號連結。

local_defines

字串清單;預設為 []

要新增至編譯行中的定義清單。適用於「Make」變數替換和 Bourne shell 符記化。每個字串都必須包含一個 Bourne shell 符記,並在開頭加上 -D,然後加入這個目標的編譯指令行,但不加入其依附項目。
nocopts

字串;預設為 ""

從 C++ 編譯指令中移除相符的選項。適用於 "Make" 變數替換。 系統會將此屬性的值解讀為規則運算式。為了編譯此規則,系統會從 COPTS 中移除任何符合此規則運算式的先前 COPTS (包括規則 copts 屬性中明確指定的值)。這項屬性應該很少需要。
strip_include_prefix

字串;預設為 ""

要從這項規則的標頭路徑中移除的前置字串。

設定後,您就可以在這個規則的 hdrs 屬性中,透過前置字串切斷來存取標頭。

如果是相對路徑,則會視為與套件相關的路徑。如果是絕對路徑,系統會將其視為相對於存放區的路徑。

這個前置字元會在移除後,新增至 include_prefix 屬性。

textual_hdrs

標籤清單;預設為 []

此程式庫發布的標頭檔案清單,可由依附規則中的來源以文字形式納入。

這是宣告無法自行編譯的標頭檔案位置,也就是說,其他來源檔案必須以文字形式納入標頭檔案,才能建構有效的程式碼。

win_def_file

標籤;預設為 None

要傳遞至連結器的 Windows DEF 檔案。

只有在 Windows 是目標平台時,才應使用這個屬性。在連結共用程式庫時,可用來 匯出符號

cc_proto_library

查看規則來源
cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

cc_proto_library 會從 .proto 檔案產生 C++ 程式碼。

deps 必須指向 proto_library 規則。

範例:

cc_library(
    name = "lib",
    deps = [":foo_cc_proto"],
)

cc_proto_library(
    name = "foo_cc_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

deps

標籤清單;預設為 []

要產生 C++ 程式碼的 proto_library 規則清單。

cc_shared_library

查看規則來源
cc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, win_def_file)

會產生共用程式庫。

範例

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

在這個範例中,foo_shared 會靜態連結 foobaz,後者是傳遞式依附元件。系統已由 dynamic_dep bar_shared 動態提供 bar,因此不會連結 bar

foo_shared 會使用連結器指令碼 *.lds 檔案,控管應匯出的符號。cc_shared_library 規則邏輯不會控制要匯出的符號,只會使用假設要匯出的符號,在分析階段提供錯誤訊息 (如果兩個共用程式庫匯出相同的目標)。

系統會假設 cc_shared_library 的每個直接依附元件都會匯出。因此,Bazel 在分析期間會假設 foo 是由 foo_shared 匯出。系統不會假設 baz 是由 foo_shared 匯出。系統也會假設 exports_filter 比對到的每個目標都會匯出。

範例中的每個 cc_library 最多只能出現在一個 cc_shared_library 中。如果我們想將 baz 連結至 bar_shared,就必須將 tags = ["LINKABLE_MORE_THAN_ONCE"] 新增至 baz

由於 shared_lib_name 屬性,bar_shared 產生的檔案名稱會是 bar.so,而非 Linux 上的預設名稱 libbar.so

錯誤

Two shared libraries in dependencies export the same symbols.

只要您建立的目標含有兩個匯出相同目標的不同 cc_shared_library 依附元件,就會發生這種情況。如要修正這個問題,您必須停止在其中一個 cc_shared_library 依附元件中匯出程式庫。

只要您建立新 cc_shared_library 時,其中包含兩個不同的 cc_shared_library 依附元件,且這些依附元件會靜態連結相同的目標,就會發生這種情況。與匯出錯誤類似。

修正這個問題的方法之一,是停止將程式庫連結至其中一個 cc_shared_library 依附元件。同時,仍連結該程式庫的應用程式需要匯出該程式庫,以便未連結該程式庫的應用程式可繼續查看該程式庫中的符號。另一種方法是提取匯出目標的第三方程式庫。第三種方法是使用 LINKABLE_MORE_THAN_ONCE 標記問題來源 cc_library,但這種修正方式應極少使用,您必須確保 cc_library 確實可安全地重複連結。

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

這表示 deps 遞移閉合中的程式庫可供存取,且不必經過其中一個 cc_shared_library 依附元件,但已連結至 dynamic_deps 中的不同 cc_shared_library,且未匯出。

解決方法是從 cc_shared_library 依附元件匯出,或提取匯出該依附元件的第三方 cc_shared_library

Do not place libraries which only contain a precompiled dynamic library in deps.

如果您有預先編譯的動態程式庫,則不需要且無法將其靜態連結至您目前正在建立的 cc_shared_library 目標。因此,它不屬於 cc_shared_librarydeps。如果這個預先編譯的動態程式庫是 cc_libraries 其中一個的依附元件,則 cc_library 需要直接依附該程式庫。

Trying to export a library already exported by a different shared library

如果您在目前的規則中聲明要匯出目標,而該目標已由其中一個動態依附元件匯出,系統就會顯示這則錯誤訊息。

如要修正這個問題,請從 deps 中移除目標,並只從動態依附元件中依賴該目標,或是確認 exports_filter 不會擷取這個目標。

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

deps

標籤清單;預設為 []

頂層程式庫,在經過整個封存作業後,會無條件地靜態連結至共用程式庫。

只要這些直接依附元件的任何間接程式庫依附元件尚未在 dynamic_deps 中連結至 cc_shared_library,就會連結至這個共用程式庫。

在分析期間,規則實作會將 deps 中列出的任何目標視為由共用程式庫匯出的目標,以便在多個 cc_shared_libraries 匯出相同目標時顯示錯誤。規則實作不會通知連結器,共用物件應匯出哪些符號。使用者應透過連結器指令碼或來源程式碼中的可見度宣告來處理這個問題。

當相同的程式庫靜態連結至多個 cc_shared_library 時,實作也會觸發錯誤。如要避免這種情況,請將 "LINKABLE_MORE_THAN_ONCE" 新增至 cc_library.tags,或將 `cc_library` 列為其中一個共用程式庫的匯出項目,以便將其中一個程式庫設為另一個程式庫的 dynamic_dep

additional_linker_inputs

標籤清單;預設為 []

您可能要傳遞給連結器的任何其他檔案,例如連結器指令碼。 您必須個別傳遞連結器需要的任何連結器標記,才能讓連結器瞭解這個檔案。您可以透過 user_link_flags 屬性執行這項操作。
dynamic_deps

標籤清單;預設為 []

這些是目前目標依附的其他 cc_shared_library 依附元件。

cc_shared_library 實作會使用 dynamic_deps 清單 (以傳遞方式,也就是目前目標 dynamic_depsdynamic_deps) 決定哪些 cc_libraries 不應連結至傳遞 deps,因為這些 cc_libraries 已由其他 cc_shared_library 提供。

exports_filter

字串清單;預設為 []

這個屬性包含聲稱由目前共用程式庫匯出的目標清單。

任何目標 deps 都已知是共用程式庫匯出的。這個屬性應用於列出共用程式庫匯出的任何目標,但這些目標是 deps 的傳遞式依附元件。

請注意,這個屬性實際上並不會為這些目標新增依附邊,而是應由 deps 建立依附邊。這個屬性中的項目只是字串。請注意,將目標放在這個屬性中,就表示共用程式庫會從該目標匯出符號。cc_shared_library 邏輯實際上不會處理告知連結器應匯出哪些符號。

以下語法是允許的:

//foo:__package__ 可用於處理 foo/BUILD 中的任何目標

//foo:__subpackages__ 可用於處理 foo/BUILD 中的任何目標,或 foo/ 以下的任何其他套件,例如 foo/bar/BUILD

shared_lib_name

字串;預設為 ""

根據預設,cc_shared_library 會根據目標名稱和平台,為共用程式庫輸出檔案使用名稱。包括擴充功能,有時也會包含前置字串。有時您可能不想要預設名稱,例如在為 Python 載入 C++ 共用程式庫時,通常不會想要使用預設的 lib* 前置字串,在這種情況下,您可以使用這個屬性選擇自訂名稱。

字串清單;預設為 []

您可能要傳遞給連結器的任何額外旗標。舉例來說,如要讓連結器瞭解透過 additional_linker_inputs 傳遞的連結器指令碼,您可以使用以下指令碼:
         cc_shared_library(
            name = "foo_shared",
            additional_linker_inputs = select({
              "//src/conditions:linux": [
                ":foo.lds",
                ":additional_script.txt",
              ],
              "//conditions:default": []}),
            user_link_flags = select({
              "//src/conditions:linux": [
                "-Wl,-rpath,kittens",
                "-Wl,--version-script=$(location :foo.lds)",
                "-Wl,--script=$(location :additional_script.txt)",
              ],
              "//conditions:default": []}),
              ...
         )
        
win_def_file

標籤;預設為 None

要傳遞至連結器的 Windows DEF 檔案。

只有在 Windows 是目標平台時,才應使用這個屬性。 在連結共用程式庫時,可用來 匯出符號

cc_static_library

查看規則來源
cc_static_library(name, deps, tags)
根據目標清單及其轉換式依附元件產生靜態程式庫。

產生的靜態資料庫包含 deps 中列出的目標物件檔案,以及其間接依附元件,並將偏好設定給 PIC 物件。

輸出群組

linkdeps

文字檔案,其中包含 deps 中列出的目標的傳遞依附元件標籤,這些目標並未為靜態資料庫提供任何物件檔案,但至少提供一個靜態、動態或介面資料庫。產生的靜態資料庫可能會要求這些程式庫在連結時可用。

linkopts

文字檔案,其中包含使用者提供的 linkopts,列出 deps 中列出的目標的所有傳遞依附元件。

重複符號

根據預設,cc_static_library 規則會檢查產生的靜態程式庫是否包含任何重複的符號。如果是這樣,建構作業就會失敗,並顯示列出重複符號和包含這些符號的物件檔案的錯誤訊息。

您可以設定 features = ["-symbol_check"],或透過 --features=-symbol_check 全面停用每個目標或每個套件的這項檢查。

symbol_check 的工具鍊支援

搭配 Bazel 提供的自動設定 C++ 工具鍊,可在所有平台上支援 symbol_check 功能。自訂工具鍊可以透過下列兩種方式之一新增支援:

  • 實作 ACTION_NAMES.validate_static_library 動作,並透過 symbol_check 功能啟用該動作。在動作中設定的工具會透過兩個引數叫用:用於檢查重複符號的靜態資料庫,以及在檢查通過時必須建立的檔案路徑。
  • symbol_check 功能新增封存器旗標,導致建立靜態資料庫的動作在重複符號上失敗。

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

deps

標籤清單;預設為 []

要合併至靜態資料庫的目標清單,包括所有遞移依附元件。

靜態程式庫不會納入未提供任何物件檔案的依附元件,但這些依附元件的標籤會收集至 linkdeps 輸出群組提供的檔案中。

fdo_prefetch_hints

查看規則來源
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

代表工作區或指定絕對路徑中的 FDO 預先擷取提示設定檔。範例:

fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

fdo_profile(
  name = "hints_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

profile

標籤;預設為 None

提示設定檔的標籤。提示檔案的副檔名為 .afdo 標籤也可以指向 fdo_absolute_path_profile 規則。

fdo_profile

查看規則來源
fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

代表工作區或指定絕對路徑中的 FDO 設定檔。範例:

fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

fdo_profile(
  name = "fdo_abs",
  absolute_path_profile = "/absolute/path/profile.zip",
)

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

absolute_path_profile

字串;預設為 ""

FDO 設定檔的絕對路徑。FDO 檔案只能使用 .afdo 副檔名。
profile

標籤;預設為 None

FDO 設定檔或產生該設定檔的規則的標籤。FDO 檔案可以有下列其中一個副檔名:.profraw 用於未編入索引的 LLVM 設定檔、.profdata 用於已編入索引的 LLVM 設定檔、.zip 用於儲存 LLVM profraw 設定檔、.afdo 用於 AutoFDO 設定檔、.xfdo 用於 XBinary 設定檔。標籤也可以指向 fdo_absolute_path_profile 規則。
proto_profile

標籤;預設為 None

Protobuf 設定檔的標籤。

memprof_profile

查看規則來源
memprof_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

代表位於工作區或指定絕對路徑的 MEMPROF 設定檔。範例:

memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

memprof_profile(
  name = "memprof_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

absolute_path_profile

字串;預設為 ""

MEMPROF 設定檔的絕對路徑。檔案只能有 .profdata 或 .zip 副檔名 (ZIP 檔案必須包含 memprof.profdata 檔案)。
profile

標籤;預設為 None

MEMPROF 設定檔的標籤。設定檔應具有 .profdata 副檔名 (針對已編入索引/符號化的 memprof 設定檔),或 .zip 副檔名 (針對內含 memprof.profdata 檔案的 ZIP 檔案)。標籤也可以指向 fdo_absolute_path_profile 規則。

propeller_optimize

查看規則來源
propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

代表工作區中的 Propeller 最佳化設定檔。範例:

propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)

propeller_optimize(
    name = "layout_absolute",
    absolute_cc_profile = "/absolute/cc_profile.txt",
    absolute_ld_profile = "/absolute/ld_profile.txt"
)

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

ld_profile

標籤;預設為 None

傳遞至連結動作的設定檔標籤。這個檔案的副檔名為 .txt。

cc_test

查看規則來源
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, link_extra_lib, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

deps

標籤清單;預設為 []

要連結至二進位目標的其他程式庫清單。

這些可以是 cc_libraryobjc_library 目標。

srcs

標籤清單;預設為 []

系統在建立目標時,會處理的 C 和 C++ 檔案清單。這些是 C/C++ 來源和標頭檔案,可能是未產生的 (一般來源程式碼) 或已產生的。

所有 .cc.c.cpp 檔案都會編譯。這些可能是產生的檔案:如果某個已命名的檔案位於其他規則的 outs 中,這個規則就會自動依附該規則。

系統不會編譯 .h 檔案,但可供此規則中的來源加入。.cc.h 檔案都能直接納入這些 srcs 中列出的標頭,或是 deps 引數中列出的任何規則的 hdrs

所有已 #include 的檔案都必須在這個規則的 srcs 屬性中提及,或是在參照的 cc_library()hdrs 屬性中提及。建議的樣式是將與程式庫相關聯的標頭列在該程式庫的 hdrs 屬性中,並將與此規則來源相關聯的任何其他標頭列在 srcs 中。詳情請參閱「"標頭包含檢查"

如果規則名稱位於 srcs 中,則此規則會自動依附該規則。如果命名規則的 outs 是 C 或 C++ 來源檔案,則會編譯至此規則;如果是程式庫檔案,則會連結進來。

允許的 srcs 檔案類型:

  • C 和 C++ 來源檔案:.c.cc.cpp.cxx.c++.C
  • C 和 C++ 標頭檔案:.h.hh.hpp.hxx.inc.inl.H
  • 使用 C 前置處理器的組譯器:.S
  • 封存:.a.pic.a
  • 「一律連結」程式庫:.lo.pic.lo
  • 共用資料庫 (已分版本或未分版本):.so.so.version
  • 物件檔案:.o.pic.o

...以及產生這些檔案的任何規則。 根據 gcc 慣例,不同的擴充功能代表不同的程式設計語言。

additional_linker_inputs

標籤清單;預設為 []

將這些檔案傳遞至 C++ 連結器指令。

例如,您可以在此提供已編譯的 Windows .res 檔案,以便嵌入二進位目標。

copts

字串清單;預設為 []

將這些選項新增至 C++ 編譯指令。適用於「Make 變數」替換和 Bourne shell 符記化

在編譯二進位目標之前,這個屬性中的每個字串都會依照指定順序新增至 COPTS。標記只會影響此目標的編譯作業,而非其依附元件,因此請留意其他地方是否包含標頭檔案。所有路徑都應以工作區為基準,而非目前套件。

如果套件宣告功能 no_copts_tokenization,Bourne shell 符記化只會套用至由單一「Make」變數組成的字串。

defines

字串清單;預設為 []

要新增至編譯行中的定義清單。適用於「Make」變數替換和 Bourne shell 符記化。每個字串都必須包含單一 Bourne 殼層符記,並在開頭加上 -D,然後新增至此目標的編譯指令行,以及依附於此目標的每個規則。請務必謹慎操作,因為這可能會造成廣泛的影響。如有疑問,請改為將定義值新增至 local_defines
includes

字串清單;預設為 []

要新增至編譯行中的包含目錄清單。

適用於 "Make 變數" 替換。 每個字串都會在開頭加上 -isystem,並新增至 COPTS。與 COPTS 不同,這些標記會新增至此規則和依附於此規則的每個規則。(注意:不是依附的規則!)請務必謹慎操作,因為這可能會造成廣泛的影響。如有疑問,請改為在 COPTS 中加入「-I」標記。

標頭必須新增至 srcs 或 hdrs,否則在編譯處於沙箱狀態 (預設) 時,依附的規則將無法使用標頭。

標籤;預設為 "@bazel_tools//tools/cpp:link_extra_lib"

控制額外程式庫的連結。

根據預設,C++ 二進位檔會連結至 //tools/cpp:link_extra_lib,而 //tools/cpp:link_extra_lib 預設會依附標籤標記 //tools/cpp:link_extra_libs。如果未設定標記,這個程式庫預設為空白。設定標籤標記可連結選用依附元件,例如弱式符號的覆寫值、共用程式庫函式的攔截器,或特殊執行階段程式庫 (針對 malloc 替換,請優先使用 malloc--custom_malloc)。將此屬性設為 None 會停用這項行為。

linkopts

字串清單;預設為 []

將這些標記新增至 C++ 連結器指令。適用於 "Make" 變數替換、 Bourne 殼層符記代碼化標籤展開。這個屬性中的每個字串都會在連結二進位目標之前新增至 LINKOPTS

清單中每個元素的開頭不是 $-,則會假設為 deps 中目標的標籤。該目標產生的檔案清單會附加至連結器選項。如果標籤無效,或未在 deps 中宣告,系統會回報錯誤。

linkstatic

布林值;預設值為 False

針對 cc_binarycc_test:在靜態模式中連結二進位檔。如為 cc_library.linkstatic:請參閱下方說明。

根據預設,這個選項會為 cc_binary 開啟,並為其他選項關閉。

如果已啟用,且這是二進位檔或測試,這個選項會指示建構工具盡可能連結 .a 而非 .so 的使用者程式庫。部分系統程式庫仍可能會以動態方式連結,而沒有靜態資料庫的程式庫也是如此。因此產生的可執行檔仍會以動態方式連結,因此只有「大部分」是靜態的。

實際上有三種不同的方式可以連結可執行檔:

  • 使用 fully_static_link 功能的 STATIC,其中所有項目都會以靜態方式連結,例如「gcc -static foo.o libbar.a libbaz.a -lm」。
    如要啟用這個模式,請在 features 屬性中指定 fully_static_link
  • STATIC,其中所有使用者程式庫會以靜態方式連結 (如果有靜態版本),但系統程式庫 (不含 C/C++ 執行階段程式庫) 會以動態方式連結,例如「gcc foo.o libfoo.a libbaz.a -lm」。
    如要啟用此模式,請指定 linkstatic=True
  • DYNAMIC,所有程式庫都會動態連結 (如果有動態版本),例如「gcc foo.o libfoo.so libbaz.so -lm」。
    如要啟用這個模式,請指定 linkstatic=False

如果 linkstatic 屬性用於 cc_library() 規則,其含義就會有所不同。對於 C++ 程式庫,linkstatic=True 表示只允許靜態連結,因此不會產生 .so。linkstatic=False 不會阻止建立靜態資料庫。這個屬性用於控制動態程式庫的建立作業。

如果是 linkstatic=False,則建構工具會在 *.runfiles 區域中建立指向依附共用程式庫的符號連結。

local_defines

字串清單;預設為 []

要新增至編譯行中的定義清單。適用於「Make」變數替換和 Bourne shell 符記化。每個字串都必須包含一個 Bourne shell 符記,並在開頭加上 -D,然後加入這個目標的編譯指令行,但不加入其依附項目。
malloc

標籤;預設為 "@bazel_tools//tools/cpp:malloc"

覆寫對 malloc 的預設依附元件。

根據預設,C++ 二進位檔會連結至 //tools/cpp:malloc,這是空白程式庫,因此二進位檔會使用 libc malloc。這個標籤必須參照 cc_library。如果編譯作業是針對非 C++ 規則,這個選項就不會生效。如果指定 linkshared=True,系統會忽略此屬性的值。

nocopts

字串;預設為 ""

從 C++ 編譯指令中移除相符的選項。適用於 "Make" 變數替換。 系統會將此屬性的值解讀為規則運算式。為了編譯此規則,系統會從 COPTS 中移除任何符合此規則運算式的先前 COPTS (包括規則 copts 屬性中明確指定的值)。這項屬性應該很少需要。
stamp

整數;預設值為 0

是否將建構資訊編碼至二進位檔。可能的值包括:
  • stamp = 1:一律將建構資訊戳記到二進位檔案中,即使是在 --nostamp 版本中也是如此。請避免使用這項設定,因為這可能會導致二進位檔和任何依賴二進位檔的後續動作無法進行遠端快取。
  • stamp = 0:一律使用常數值取代建構資訊。這可提供良好的建構結果快取功能。
  • stamp = -1:版本資訊的嵌入方式由 --[no]stamp 標記控制。

除非依附元件變更,否則系統不會重新建構經過標記的二進位檔。

win_def_file

標籤;預設為 None

要傳遞至連結器的 Windows DEF 檔案。

只有在 Windows 是目標平台時,才應使用這個屬性。在連結共用程式庫時,可用來 匯出符號

cc_toolchain

查看規則來源
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)

代表 C++ 工具鍊。

此規則負責:

  • 收集執行 C++ 動作所需的所有構件。這項操作會透過 all_filescompiler_fileslinker_files 或其他以 _files 結尾的屬性完成。這些屬性通常是用來將所有必要檔案納入檔案群組。
  • 為 C++ 動作產生正確的命令列。這項操作是使用 CcToolchainConfigInfo 供應器完成的 (詳情請見下文)。

使用 toolchain_config 屬性設定 C++ 工具鍊。如要進一步瞭解 C++ 工具鍊設定和工具鍊選取說明文件,請參閱這個 頁面

使用 tags = ["manual"] 可避免在叫用 bazel build //... 時,不必要地建構及設定工具鍊

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

all_files

標籤;必填

收集所有 cc_toolchain 構件。這些構件會新增為所有 rules_cc 相關動作的輸入內容 (使用屬性中更精確的構件集的動作除外)。Bazel 會假設 all_files 是所有其他提供構件屬性的集合 (例如,連結標記編譯作業需要編譯和連結檔案,因此會使用 all_files)。

這就是 cc_toolchain.files 的內容,所有使用 C++ 工具鍊的 Starlark 規則都會使用這個內容。

ar_files

標籤;預設為 None

收集封存動作所需的所有 cc_toolchain 構件。

as_files

標籤;預設為 None

收集組合動作所需的所有 cc_toolchain 構件。

compiler_files

標籤;必填

收集編譯動作所需的所有 cc_toolchain 構件。
compiler_files_without_includes

標籤;預設為 None

在支援輸入探索功能的情況下,收集編譯動作所需的所有 cc_toolchain 構件 (目前僅限 Google)。
coverage_files

標籤;預設為 None

收集涵蓋率動作所需的所有 cc_toolchain 構件。如果未指定,系統會使用 all_files。
dwp_files

標籤;必填

收集 dwp 動作所需的所有 cc_toolchain 構件。
dynamic_runtime_lib

標籤;預設為 None

C++ 執行階段程式庫的動態程式庫構件 (例如 libstdc++.so)。

當您啟用「static_link_cpp_runtimes」功能,並且要動態連結依附元件時,就會使用這個值。

exec_transition_for_inputs

布林值;預設值為 True

將其設為 True 可為執行平台的 cc_toolchain 建構所有檔案輸入內容,而非沒有轉換 (也就是預設的目標平台)。
libc_top

標籤;預設為 None

一系列 libc 構件,會作為編譯/連結動作的輸入內容傳遞。
linker_files

標籤;必填

收集連結動作所需的所有 cc_toolchain 構件。
module_map

標籤;預設為 None

模組對應成果物,用於模組化建構。
objcopy_files

標籤;必填

收集 objcopy 動作所需的所有 cc_toolchain 構件。
static_runtime_lib

標籤;預設為 None

C++ 執行階段程式庫的靜態資料庫構件 (例如 libstdc++.a)。

當您啟用「static_link_cpp_runtimes」功能,並且以靜態方式連結依附元件時,系統就會使用這個值。

strip_files

標籤;必填

收集所有去除動作所需的 cc_toolchain 構件。
supports_header_parsing

布林值;預設值為 False

如果 cc_toolchain 支援標頭剖析動作,請將此值設為 True。
supports_param_files

布林值;預設值為 True

如果 cc_toolchain 支援使用 param 檔案連結動作,請將此值設為 True。
toolchain_config

標籤;必填

提供 cc_toolchain_config_info 的規則標籤。
toolchain_identifier

字串;不可設定;預設值為 ""

用於將這個 cc_toolchain 與對應的 crosstool_config.toolchain 比對的 ID。

在問題 #5380 修正前,這是建議將 cc_toolchainCROSSTOOL.toolchain 建立關聯的方式。這項屬性將會替換為 toolchain_config (#5380)。

cc_toolchain_suite

查看規則來源
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

代表 C++ 工具鍊的集合。

此規則負責:

  • 收集所有相關的 C++ 工具鍊。
  • 根據傳遞至 Bazel 的 --cpu--compiler 選項,選取一個工具鍊。

如要進一步瞭解 C++ 工具鍊設定和工具鍊選取說明文件,請參閱這個 頁面

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

toolchains

字典,將字串對應至標籤不可設定;必要

從「<cpu>」或「<cpu>|<compiler>」字串對應至 cc_toolchain 標籤。如果只有 --cpu 傳遞至 Bazel,系統會使用「<cpu>"」;如果 --cpu--compiler 都傳遞至 Bazel,系統會使用「<cpu>|<compiler>"。示例:

          cc_toolchain_suite(
            name = "toolchain",
            toolchains = {
              "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc",
              "piii": ":my_cc_toolchain_for_piii_using_default_compiler",
            },
          )