C / C++ 規則

回報問題 敬上 查看原始碼 。 。 。 。 夜間7.37.2 。 。 7.17.06.5

規則

cc_binary

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

這會產生可執行的二進位檔。


目標的 name 應與 應用程式主要進入點的來源檔案 (減去副檔名)。 舉例來說,如果進入點位於 main.cc,則名稱應為 應為 main

隱含輸出目標

  • name.stripped (只會在明確要求時建構):移除 最新版本的二進位檔案strip -g 已在二進位檔上執行,以移除偵錯 符號。您可以透過指令列 --stripopt=-foo
  • name.dwp (僅在明確要求時建構):如果 Fission 已啟用:偵錯 適用於遠端部署二進位檔偵錯的資訊套件。其他: 空白檔案。

引數

屬性
name

名稱;必選

此目標的專屬名稱。

deps

標籤清單;預設為 []

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

可以是 cc_libraryobjc_library 目標。

您也可以將 將連接器指令碼 (.lds) 放入 deps 中,並在 linkopts
srcs

標籤清單;預設為 []

要處理的 C 和 C++ 檔案清單,用於建立程式庫目標。 這些是 C/C++ 來源檔案和標頭檔案,可以是非產生的 (一般來源檔案) 程式碼) 或由系統產生

所有 .cc.c.cpp 檔案都會 加以編譯如果檔案名稱位於 其他規則的outs,這個cc_library 會自動採用另一項規則

純組組合檔案 (.s、.asm) 不會預先處理,通常使用 組合器。預先處理的組合檔案 (.S) 會經過預先處理,通常建構在 C/C++ 編譯器

.h 檔案不會經過編譯,但可在 依據來源納入這項規則中的來源。.cc.h 檔案中可以直接加入 這些srcs、此規則的 hdrs,或任何 有規則列在 deps 引數中。

總共 #included 個檔案必須在以下示例中提及: 這項屬性或參照的 cc_libraryhdrs 屬性 ,如果是私人性質,則應列在 srcs 中 加入這個程式庫請參閱「標頭納入檢查」一節,瞭解 提供更詳細的說明

.so.lo.a 個檔案 預先編譯的檔案您的媒體庫可能會提供這些項目: srcs (如果使用我們不使用的第三方程式碼) 取得原始碼

如果 srcs 屬性包含其他規則的標籤, cc_library 會使用該規則的輸出檔案做為 下一步是使用 compile 方法 指定訓練方式,完成模型編譯這對產生一次性原始碼來說很實用 (與有時會超過 建議您導入 Starlark 規則類別,並使用 cc_common API)

允許的 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

... 以及產生這些檔案的任何規則 (例如 cc_embed_data)。 不同的擴充功能代表 改成 gcc 慣例

data

標籤清單;預設為 []

這個程式庫在執行階段所需的檔案清單。 查看關於「data」的一般留言 通常是由 大部分的建構規則

如果 data 是產生的檔案名稱,則 cc_library 規則會自動根據產生的 規則。

如果 data 是規則名稱,則 有 cc_library 項規則會自動採用該規則 而且該規則的outs會自動新增至 這個cc_library的資料檔案。

C++ 程式碼可存取這些資料檔案,如下所示:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

標籤清單;預設為 []

將這些檔案傳送至 C++ 連接器指令。

舉例來說,可以在這裡提供已編譯的 Windows .res 檔案,以便嵌入 做為二進位目標

copts

字串清單;預設值為 []

將這些選項新增至 C++ 編譯指令。 取決於「化變數」替代和 Bourne 殼層權杖化

此屬性中的每個字串都會按照指定順序新增至 COPTS, 來編譯二進位目標標記只會在編譯這個目標時生效,不會 因此,請謹慎處理包含在其他地方的標頭檔案。 所有路徑均應以工作區為相對路徑,而非目前的套件。 在 third_party 以外不應使用這個屬性。

如果套件已宣告功能 no_copts_tokenization,Bourne 殼層權杖化功能僅適用於字串 其中包含一個「廠牌」變數。

defines

字串清單;預設值為 []

要新增至編譯行的定義清單。 取決於 「廠牌」替代和 Bourne 殼層權杖化。 每個字串都必須包含單一 Bourne 殼層符記 加在 -D 的前面,並新增至這個目標的編譯指令列。 並套用仰賴規則的每項規則請務必小心,因為這可能有 影響深遠的影響如有疑問,請將定義值加進 local_defines
dynamic_deps

標籤清單;預設為 []

以下是目前目標依附的其他 cc_shared_library 依附元件。

cc_shared_library 實作會使用 dynamic_deps (轉移之餘,即 dynamic_deps 目前目標的dynamic_deps),決定哪些cc_libraries 請勿連結遞移的 deps,因為已提供相關服務 由其他 cc_shared_library 產生。

hdrs_check

String;預設值為 ""

已淘汰,免人工管理。
includes

字串清單;預設值為 []

要新增至編譯行的包含 URI 清單。 套用至「Make 變數」替代。 每個字串前面都會加上套件路徑,並傳遞至 C++ 工具鍊 透過「include_paths」CROSSTOOL 功能。在 POSIX 系統上執行的工具鍊 一般特徵定義會產生 -isystem path_to_package/include_entry。 這個版本僅適用於符合下列條件的第三方程式庫 不符合 Google 撰寫 #include 陳述式的樣式。 與最佳化不同,系統會在這項規則中新增這些標記 並提供相關的所有規則(注意:而不是仰賴的規則!)成為 因為這樣可能帶來相當深遠的影響有疑慮就加上 「-我」標記為 COPTS

新增的 include 路徑會包括系統產生的檔案 來源樹狀結構中的檔案。

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

控管額外程式庫的連結作業。

根據預設,C++ 二進位檔會與 //tools/cpp:link_extra_lib 連結, 視標籤標記 //tools/cpp:link_extra_libs 而定。 如果沒有設定此標記,這個程式庫預設會空白。設定標籤標記 可連結選用的依附元件,例如惡意符號、攔截器的覆寫值 使用共用程式庫函式或特殊的執行階段程式庫 (如果是 Malloc 替換項目, 建議採用 malloc--custom_malloc)。將此屬性設定為 None 會停用這個行為。

linkopts

字串清單;預設值為 []

將這些標記新增至 C++ 連接器指令。 取決於 「廠牌」替代變數, Bourne 殼層權杖化展開標籤。 此屬性中的每個字串都加到 LINKOPTS 之前, 來連結二進位資料

這份清單中每個開頭不是 $- 的元素 假設為 deps 中目標的標籤。 該目標產生的檔案清單會附加至連結器 只要設定成「自動重新啟動」 和「在主機維護期間」選項即可如果標籤無效或 未在 deps 中宣告。

linkshared

布林值;預設值為 False

建立共用資料庫。 如要啟用這項屬性,請在規則中加入 linkshared=True。預設 這個選項就會停用

出現這個旗標,表示連結是透過 -shared 標記完成 新增至 gcc,產生的共用資料庫適合載入 Java 程式範例不過,基於建構目的,這個 API 永遠不會連結至 相依二進位檔,因為原定方法為透過 cc_binary 規則只有其他程式手動載入,因此 不應視為替代 cc_library 規則。為提高擴充性,建議您完全避免採用此方法, 讓 java_library 依附於 cc_library 規則 。

如果同時指定 linkopts=['-static']linkshared=True, 即可獲得一個完全獨立的單元如果您同時指定 linkstatic=Truelinkshared=True,您大多能獲得單價 獨立單元

linkstatic

布林值;預設值為 True

適用於 cc_binarycc_test:連結靜態的二進位檔 模式。cc_library.link_static:請參閱下方說明。

這個選項預設為 cc_binary,其餘則為關閉。

如果啟用此選項,且是二進位檔或測試項目,這個選項會指示建構工具 .a,盡可能避免使用 .so 的使用者程式庫。 系統程式庫,例如 libc (但「不是」C/C++ 執行階段程式庫; 如下所示) 仍會以動態方式連結, 我們沒有靜態資料庫因此,產生的執行檔仍會 不過,因此只能「幾乎」都是靜態資料。

連結執行檔的方法有三種:

  • 使用 Full_static_link 功能 STATIC,所有內容皆以靜態方式連結; 例如:「gcc -static foo.o libbar.a libbaz.a -lm」。
    啟用這個模式的方式,就是在fully_static_link features 屬性。
  • STATIC:以靜態方式連結所有使用者程式庫 (如果是 可用的版本),但系統程式庫 (不包括 C/C++ 執行階段程式庫) 會透過動態連結的方式連結 (例如「gcc foo.o libfoo.a libbaz.a -lm」。
    透過指定 linkstatic=True 即可啟用這個模式。
  • 動態版本:所有程式庫皆以動態方式連結 (如果動態版本是 可用),例如:「gcc foo.o libfoo.so libbaz.so -lm」。
    透過指定 linkstatic=False 即可啟用這個模式。

如果 linkstatic 屬性或 fully_static_linkfeatures」已用於 //third_party 以外的地方 請在規則附近留言說明原因

linkstatic 屬性如果用於 cc_library() 規則。 如果是 C++ 程式庫,linkstatic=True 表示只有 系統允許使用靜態連結,因此不會產生 .so。linkstatic=False 包含 但無法防止建立靜態資料庫這個屬性是用來控制 動態程式庫建立程序

在實際工作環境中,應該幾乎使用 linkstatic=False 建構的程式碼。 如果值為 linkstatic=False,建構工具會建立符號連結,指向 依賴 *.runfiles 區域的共用程式庫

local_defines

字串清單;預設值為 []

要新增至編譯行的定義清單。 取決於 「廠牌」替代和 Bourne 殼層權杖化。 每個字串都必須包含單一 Bourne 殼層符記 加在 -D 的前面,並新增至這個目標的編譯指令列。 而非依附關係
malloc

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

覆寫 Malloc 的預設依附元件。

根據預設,C++ 二進位檔會與 //tools/cpp:malloc 連結, 是空的程式庫,所以二進位檔最終會使用 libc malloc。 這個標籤必須參照 cc_library。如果是編譯非 C++ 如果發生下列情形,系統會忽略這個屬性的值: 已指定 linkshared=True

module_interfaces

標籤清單;預設為 []

檔案清單即為 C++20 模組介面。

C++ 標準對模組介面副檔名沒有限制

  • Clang 使用 cppm
  • GCC 可以使用任何來源副檔名
  • MSVC 使用 ixx

該標記會保護使用行為 --experimental_cpp_modules

nocopts

String;預設值為 ""

移除 C++ 編譯指令中的相符選項。 取決於 「廠牌」變數替代。 這個屬性的值會解讀為規則運算式。 符合這個規則運算式的任何現有 COPTS (包括規則的 copts 屬性中明確指定的值) 將會從「COPTS」中移除,以便編譯這項規則。 你不需要或使用這項屬性 third_party 以外的值。系統不會預先處理這些值 除了「廠牌」替代變數。
reexport_deps

標籤清單;預設為 []

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, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, 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.連結共用資料庫與介面程式庫

在 Unix 上:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # libmylib.ifso is an interface library for libmylib.so which will be passed to linker
  interface_library = "libmylib.ifso",
  # libmylib.so will be available for runtime
  shared_library = "libmylib.so",
)

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

在 Unix 上:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
  # libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
  # This indicates that Bazel is not responsible for making libmylib.so available.
  system_provided = 1,
)

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. AI 必須採行 隱私保護設計原則連結至靜態或共用資料庫

在 Unix 上:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

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",
)

Unix 和 Windows 上的其餘功能相同:


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

# second will link to libmylib.so (or libmylib.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++ 的二進位檔 靜態程式庫中封存的所有物件檔案,都會連結到預先編譯的程式庫 即使某些符號不包含二進位參照的符號。 如果程式碼中的程式碼未明確呼叫,這個方法就很實用 二進位檔案 (舉例來說,如果您的程式碼註冊以取得某些回呼) 這項工具可讓您存取 該基礎架構的各項服務

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

includes

字串清單;預設值為 []

要新增至編譯行的包含 URI 清單。 套用至「Make 變數」替代。 每個字串前面都會加上套件路徑,並傳遞至 C++ 工具鍊 透過「include_paths」CROSSTOOL 功能。在 POSIX 系統上執行的工具鍊 一般特徵定義會產生 -isystem path_to_package/include_entry。 這個版本僅適用於符合下列條件的第三方程式庫 不符合 Google 撰寫 #include 陳述式的樣式。 與最佳化不同,系統會在這項規則中新增這些標記 並提供相關的所有規則(注意:而不是仰賴的規則!)成為 因為這樣可能帶來相當深遠的影響有疑慮就加上 「-我」標記為 COPTS

預設 include 路徑未包含產生的 檔案。如需對產生的標頭執行 #include 檔案,請在 srcs 中列出。

interface_library

標籤;預設為 None

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

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

linkopts

字串清單;預設值為 []

將這些標記新增至 C++ 連接器指令。 取決於 「廠牌」替代變數, Bourne 殼層權杖化展開標籤。 此屬性中的每個字串都加到 LINKOPTS 之前, 來連結二進位資料

這份清單中每個開頭不是 $- 的元素 假設為 deps 中目標的標籤。 該目標產生的檔案清單會附加至連結器 只要設定成「自動重新啟動」 和「在主機維護期間」選項即可如果標籤無效或 未在 deps 中宣告。

objects

標籤清單;預設為 []

pic_objects

標籤清單;預設為 []

pic_static_library

標籤;預設為 None

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, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

針對 C++ 編譯的程式庫使用 cc_library()。 結果會是 .so.lo。 或 .a (視需要而定)。

如果您是使用靜態連結建構項目 cc_library,依附於依附程式庫規則的輸出內容 則是 .a 檔案如果指定 alwayslink=True,即可取得 .lo 檔案。

實際的輸出檔案名稱為 libfoo.so, 共用資料庫,其中 foo 是規則名稱。 其他種類的程式庫結尾為 .lo.a 。如果需要特定的共用程式庫名稱 舉例來說,如要定義 Python 模組,請使用 genrule 來複製資料庫 拖曳到所需名稱

標頭納入檢查

凡是用於建構作業的標頭檔案,都必須在 cc_* 規則的 hdrssrcs。 這是強制執行的,

對於 cc_library 規則,hdrs 中的標頭由 程式庫的公開介面,並可直接包含 從程式庫 hdrssrcs 的檔案中移除 以及 hdrssrcs 中的檔案 在 deps 中列出程式庫的 cc_* 規則。 srcs 中的標頭只能直接從檔案中加入 位於程式庫本身的 hdrssrcs。時間 決定要將標頭放在 hdrs 還是 srcs 中 應思考是否要讓這個媒體庫的使用者 直接納入這項決定大致與 介於程式設計語言中的 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

納入檢查規則僅適用於 direct 包容。在上述範例中,foo.cc 可允許 包含 bar.h,其中可能包括 baz.h 允許轉彎,允許包括baz-impl.h。技術上 .cc 檔案的編譯方式可能間接包含任何標頭 該檔案位於 hdrssrcs 中 遞移 deps 封閉的任何cc_library。於 在此情況下,編譯器可能會讀取 baz.hbaz-impl.h 編譯 foo.cc 時,但 foo.cc 不得 包含 #include "baz.h"。為了達成這個目標 已允許,必須將 baz 新增至 deps (共 foo 個)。

Bazel 仰賴工具鍊支援來強制執行納入檢查規則。 工具鍊必須支援 layering_check 功能 並明確發出要求 --features=layering_check 指令列旗標或 features 參數的 package 函式。工具鍊 ,但 Bazel 僅適用於在 Unix 和 macOS 上使用 clang。

範例


cc_library(
    name = "ast_inspector_lib",
    srcs = ["ast_inspector_lib.cc"],
    hdrs = ["ast_inspector_lib.h"],
    visibility = ["//visibility:public"],
    deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
    # alwayslink as we want to be able to call things in this library at
    # debug time, even if they aren't used anywhere in the code.
    alwayslink = 1,
)

以下範例取自 third_party/python2_4_3/BUILD。 部分程式碼使用 dl 程式庫 (載入 另一個是動態程式庫) 來說 規則會指定將 -ldl 連結選項連結至 dl 程式庫。


cc_library(
    name = "python2_4_3",
    linkopts = [
        "-ldl",
        "-lutil",
    ],
    deps = ["//third_party/expat"],
)

以下範例來自 third_party/kde/BUILD。 並將預先建立的 .so 檔案保留在庫中。 標頭檔案位於名為 include 的子目錄中。


cc_library(
    name = "kde",
    srcs = [
        "lib/libDCOP.so",
        "lib/libkdesu.so",
        "lib/libkhtml.so",
        "lib/libkparts.so",
        ...more .so files...,
    ],
    includes = ["include"],
    deps = ["//third_party/X11"],
)

以下範例來自 third_party/gles/BUILD。 第三方程式碼通常需要一些 defineslinkopts


cc_library(
    name = "gles",
    srcs = [
        "GLES/egl.h",
        "GLES/gl.h",
        "ddx.c",
        "egl.c",
    ],
    defines = [
        "USE_FLOAT",
        "__GL_FLOAT",
        "__GL_COMMON",
    ],
    linkopts = ["-ldl"],  # uses dlopen(), dl library
    deps = [
        "es",
        "//third_party/X11",
    ],
)

引數

屬性
name

名稱;必選

此目標的專屬名稱。

deps

標籤清單;預設為 []

該程式庫指定的其他程式庫清單。

目標可以是 cc_libraryobjc_library

查看關於「deps」的一般留言 通常是由 大部分的建構規則

這些應為 C++ 程式庫規則的名稱。 當您建構會連結這項規則的程式庫的二進位檔時, 您也要在 deps 中連結程式庫。

「deps」名稱,並非這個程式庫的所有用戶端 資源執行時間資料依附元件隸屬於 data。 其他規則產生的來源檔案屬於 srcs

如要連結預先編譯的第三方程式庫,請將該程式庫的名稱新增至 改為 srcs

如果只想依附項目,而不連結至這個程式庫,請新增下列項目 改為 data

srcs

標籤清單;預設為 []

要處理的 C 和 C++ 檔案清單,用於建立程式庫目標。 這些是 C/C++ 來源檔案和標頭檔案,可以是非產生的 (一般來源檔案) 程式碼) 或由系統產生

所有 .cc.c.cpp 檔案都會 加以編譯如果檔案名稱位於 其他規則的outs,這個cc_library 會自動採用另一項規則

純組組合檔案 (.s、.asm) 不會預先處理,通常使用 組合器。預先處理的組合檔案 (.S) 會經過預先處理,通常建構在 C/C++ 編譯器

.h 檔案不會經過編譯,但可在 依據來源納入這項規則中的來源。.cc.h 檔案中可以直接加入 這些srcs、此規則的 hdrs,或任何 有規則列在 deps 引數中。

總共 #included 個檔案必須在以下示例中提及: 這項屬性或參照的 cc_libraryhdrs 屬性 ,如果是私人性質,則應列在 srcs 中 加入這個程式庫請參閱「標頭納入檢查」一節,瞭解 提供更詳細的說明

.so.lo.a 個檔案 預先編譯的檔案您的媒體庫可能會提供這些項目: srcs (如果使用我們不使用的第三方程式碼) 取得原始碼

如果 srcs 屬性包含其他規則的標籤, cc_library 會使用該規則的輸出檔案做為 下一步是使用 compile 方法 指定訓練方式,完成模型編譯這對產生一次性原始碼來說很實用 (與有時會超過 建議您導入 Starlark 規則類別,並使用 cc_common API)

允許的 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

... 以及產生這些檔案的任何規則 (例如 cc_embed_data)。 不同的擴充功能代表 改成 gcc 慣例

data

標籤清單;預設為 []

這個程式庫在執行階段所需的檔案清單。 查看關於「data」的一般留言 通常是由 大部分的建構規則

如果 data 是產生的檔案名稱,則 cc_library 規則會自動根據產生的 規則。

如果 data 是規則名稱,則 有 cc_library 項規則會自動採用該規則 而且該規則的outs會自動新增至 這個cc_library的資料檔案。

C++ 程式碼可存取這些資料檔案,如下所示:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
hdrs

標籤清單;預設為 []

發布標頭檔案清單 並將這個程式庫直接納入相依規則的來源

此為強烈建議使用此處宣告的標頭檔案位置 描述程式庫的介面這些標頭就會 依據來源納入這項規則或依附規則。 不應由這個程式庫用戶端包含的標頭 列在 srcs 屬性中,即使它們 手動加入其中一個目錄請參閱「標頭納入」 檢查」即可瞭解詳情。

允許的 headers 檔案類型: .h, .hh, .hpp, .hxx

additional_compiler_inputs

標籤清單;預設為 []

您可能會想傳遞至編譯器指令列的任何其他檔案,例如 Sanitizer 忽略清單。您在這裡指定的檔案,就可以搭配 $(location) 函式。
additional_linker_inputs

標籤清單;預設為 []

將這些檔案傳送至 C++ 連接器指令。

舉例來說,可以在這裡提供已編譯的 Windows .res 檔案,以便嵌入 做為二進位目標

布林值;預設值為 False

如為 1,則任何直接或間接仰賴這個 C++ 的二進位檔 資料夾中列出的檔案 srcs (即使有些不包含二進位檔參照的符號)。 如果程式碼中的程式碼未明確呼叫,這個方法就很實用 二進位檔案 (舉例來說,如果您的程式碼註冊以取得某些回呼) 這項工具可讓您存取 該基礎架構的各項服務

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

copts

字串清單;預設值為 []

將這些選項新增至 C++ 編譯指令。 取決於「化變數」替代和 Bourne 殼層權杖化

此屬性中的每個字串都會按照指定順序新增至 COPTS, 來編譯二進位目標標記只會在編譯這個目標時生效,不會 因此,請謹慎處理包含在其他地方的標頭檔案。 所有路徑均應以工作區為相對路徑,而非目前的套件。 在 third_party 以外不應使用這個屬性。

如果套件已宣告功能 no_copts_tokenization,Bourne 殼層權杖化功能僅適用於字串 其中包含一個「廠牌」變數。

defines

字串清單;預設值為 []

要新增至編譯行的定義清單。 取決於 「廠牌」替代和 Bourne 殼層權杖化。 每個字串都必須包含單一 Bourne 殼層符記 加在 -D 的前面,並新增至這個目標的編譯指令列。 並套用仰賴規則的每項規則請務必小心,因為這可能有 影響深遠的影響如有疑問,請將定義值加進 local_defines
hdrs_check

String;預設值為 ""

已淘汰,免人工管理。
implementation_deps

標籤清單;預設為 []

該程式庫鎖定的其他程式庫清單。取消喜歡 deps,標頭和包含這些程式庫的路徑 (及其全部路徑) 遞移依附元件) 只會用於這個程式庫的編譯作業,不適用於 依靠它使用 implementation_deps 指定的程式庫仍在連結中 取決於這個程式庫的二進位目標

目前僅限使用 cc_libraries,並受到標記的保護 --experimental_cc_implementation_deps

include_prefix

String;預設值為 ""

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

設定後,即可存取這項規則 hdrs 屬性中的標頭 at 是這個屬性的值,在其存放區相關路徑前面。

系統會先移除 strip_include_prefix 屬性中的前置字元 前置字元,

這項屬性僅適用 third_party

includes

字串清單;預設值為 []

要新增至編譯行的包含 URI 清單。 套用至「Make 變數」替代。 每個字串前面都會加上套件路徑,並傳遞至 C++ 工具鍊 透過「include_paths」CROSSTOOL 功能。在 POSIX 系統上執行的工具鍊 一般特徵定義會產生 -isystem path_to_package/include_entry。 這個版本僅適用於符合下列條件的第三方程式庫 不符合 Google 撰寫 #include 陳述式的樣式。 與最佳化不同,系統會在這項規則中新增這些標記 並提供相關的所有規則(注意:而不是仰賴的規則!)成為 因為這樣可能帶來相當深遠的影響有疑慮就加上 「-我」標記為 COPTS

新增的 include 路徑會包括系統產生的檔案 來源樹狀結構中的檔案。

linkopts

字串清單;預設值為 []

請見 cc_binary.linkoptslinkopts 屬性也適用於 透過 deps 直接或間接依附這個程式庫 屬性 (或其他以類似方式處理的屬性): malloc cc_binary 的屬性)。依附元件 連結最佳化的優先度高於相依連結選擇 (例如依附元件的連結最佳化) 您之後才會出現在指令列中)。已在 --linkopt敬上 的優先順序高於規則連結最佳化

請注意,linkopts 屬性僅適用於 建立 .so 檔案或執行檔時, 建立 .a.lo 檔案時啟用 因此,如果設定了 linkstatic=True 屬性, linkopts 屬性對建立 將僅適用於依附此程式庫的其他目標。

另外,請務必注意「-Wl,-soname」或「-Xlinker -soname」 選項不受支援,且不得在這項屬性中指定。

cc_library 產生的 .so 檔案 規則不會根據其相依的程式庫 保持開啟。如要建立要使用的共用程式庫 在主要存放區之外,例如以手動方式使用 dlopen()LD_PRELOAD, 建議使用 cc_binary 規則 與 linkshared=True 屬性相同。 請見 cc_binary.linkshared

linkstamp

標籤;預設為 None

同時編譯指定的 C++ 來源檔案,並連結至最終版本 二進位檔案。必須藉由這個技巧來引入時間戳記 將資料轉換為二進位檔只要將來源檔案編譯成 物件檔案中,時間戳記就會不正確。 連結取樣編譯不得包含任何特定一組 編譯器旗標,因此不應仰賴任何特定 標頭、編譯器選項或其他建構變數。 只有在 base 套件。
linkstatic

布林值;預設值為 False

適用於 cc_binarycc_test:連結靜態的二進位檔 模式。cc_library.link_static:請參閱下方說明。

這個選項預設為 cc_binary,其餘則為關閉。

如果啟用此選項,且是二進位檔或測試項目,這個選項會指示建構工具 .a,盡可能避免使用 .so 的使用者程式庫。 系統程式庫,例如 libc (但「不是」C/C++ 執行階段程式庫; 如下所示) 仍會以動態方式連結, 我們沒有靜態資料庫因此,產生的執行檔仍會 不過,因此只能「幾乎」都是靜態資料。

連結執行檔的方法有三種:

  • 使用 Full_static_link 功能 STATIC,所有內容皆以靜態方式連結; 例如:「gcc -static foo.o libbar.a libbaz.a -lm」。
    啟用這個模式的方式,就是在fully_static_link features 屬性。
  • STATIC:以靜態方式連結所有使用者程式庫 (如果是 可用的版本),但系統程式庫 (不包括 C/C++ 執行階段程式庫) 會透過動態連結的方式連結 (例如「gcc foo.o libfoo.a libbaz.a -lm」。
    透過指定 linkstatic=True 即可啟用這個模式。
  • 動態版本:所有程式庫皆以動態方式連結 (如果動態版本是 可用),例如:「gcc foo.o libfoo.so libbaz.so -lm」。
    透過指定 linkstatic=False 即可啟用這個模式。

如果 linkstatic 屬性或 fully_static_linkfeatures」已用於 //third_party 以外的地方 請在規則附近留言說明原因

linkstatic 屬性如果用於 cc_library() 規則。 如果是 C++ 程式庫,linkstatic=True 表示只有 系統允許使用靜態連結,因此不會產生 .so。linkstatic=False 包含 但無法防止建立靜態資料庫這個屬性是用來控制 動態程式庫建立程序

在實際工作環境中,應該幾乎使用 linkstatic=False 建構的程式碼。 如果值為 linkstatic=False,建構工具會建立符號連結,指向 依賴 *.runfiles 區域的共用程式庫

local_defines

字串清單;預設值為 []

要新增至編譯行的定義清單。 取決於 「廠牌」替代和 Bourne 殼層權杖化。 每個字串都必須包含單一 Bourne 殼層符記 加在 -D 的前面,並新增至這個目標的編譯指令列。 而非依附關係
module_interfaces

標籤清單;預設為 []

檔案清單即為 C++20 模組介面。

C++ 標準對模組介面副檔名沒有限制

  • Clang 使用 cppm
  • GCC 可以使用任何來源副檔名
  • MSVC 使用 ixx

該標記會保護使用行為 --experimental_cpp_modules

strip_include_prefix

String;預設值為 ""

要從這項規則的標頭路徑去除的前置字元,

設定後,即可存取這項規則 hdrs 屬性中的標頭 遭到截斷的前置字元

如果是相對路徑,則會採用套件相關路徑。如果是絕對值 可理解為存放區相關路徑

緊接在 include_prefix 屬性中的前置字元後,再加上 移除。

這項屬性僅適用 third_party

textual_hdrs

標籤清單;預設為 []

發布標頭檔案清單 這個程式庫會以文字形式納入依附規則的來源。

這是宣告無法自行編譯的標頭檔案的位置; 也就是說,這些物件必須一律 在其他來源檔案以文字形式納入 再也不是件繁重乏味的工作

win_def_file

標籤;預設為 None

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

只有在 Windows 是目標平台時,才能使用這項屬性。 可用於 匯出符號

cc_proto_library

查看規則來源
cc_proto_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, 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

標籤清單;預設為 []

proto_library 清單 並產生 C++ 程式碼

cc_shared_library

查看規則來源
cc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, experimental_disable_topo_sort_do_not_use_remove_before_7_0, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, 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,後者代表遞移依附元件。這沒有 連結 bar,因為此網址是由 dynamic_dep bar_shared

foo_shared 會使用連接器指令碼 *.lds 檔案來控制 都必須匯出。cc_shared_library 規則邏輯會執行 這項功能只會採用系統假設 如果兩個共用程式庫匯出 相同的目標。

假設每個 cc_shared_library 的直接依附元件都是 已匯出。因此,Bazel 會在分析期間假設 foofoo_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 目標 建立模型因此不在 depscc_shared_library。如果這個預先編譯的動態程式庫是 cc_libraries,那麼 cc_library 需要依附於

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

如果目前您宣稱要匯出 已由其中一個動態依附元件匯出的目標。

如要修正這個問題,請從 deps 中移除目標,請直接從動態中使用 或確保 exports_filter 不會擷取這個目標。

引數

屬性
name

名稱;必選

此目標的專屬名稱。

deps

標籤清單;預設為 []

以靜態方式連結至共用資料庫的頂層程式庫 進行封存

這些直接依附元件的所有遞移程式庫依附元件都會連結至這個共用項目 只要 cc_shared_library 尚未連結這些程式庫 位置:dynamic_deps

在分析過程中,執行規則時會考量 deps (由共用資料庫匯出),以便在以下情況下發生錯誤: 多個 cc_shared_libraries 匯出相同的目標。規則執行 並不負責向連結器說明應由 共用物件使用者應透過連結器指令碼或瀏覽權限 。

此外,如果以靜態方式連結同一個程式庫,這項實作也會觸發錯誤 嵌入多個 cc_shared_library。若要避免這種情況,方法是新增 向「cc_library.tags」傳送"LINKABLE_MORE_THAN_ONCE"或列出清單 將 `cc_library` 當做其中一個共用程式庫的匯出檔案, 另一版本的 dynamic_dep

additional_linker_inputs

標籤清單;預設為 []

您要傳送給連結器的任何其他檔案,例如連結器指令碼。 您必須個別傳遞連結器標記所需的任何連結器標記, 這個檔案。方法是透過 user_link_flags 屬性。
dynamic_deps

標籤清單;預設為 []

以下是目前目標依附的其他 cc_shared_library 依附元件。

cc_shared_library 實作會使用 dynamic_deps (轉移之餘,即 dynamic_deps 目前目標的dynamic_deps),決定哪些cc_libraries 請勿連結遞移的 deps,因為已提供相關服務 由其他 cc_shared_library 產生。

experimental_disable_topo_sort_do_not_use_remove_before_7_0

布林值;預設值為 False

exports_filter

字串清單;預設值為 []

這項屬性包含清單,列出目前宣稱要匯出的目標目標 共用媒體庫

共用資料庫已可匯出所有目標「deps」。 這項屬性應用於列出共用資料庫匯出的所有目標 而是 deps 的遞移依附元件

請注意,此屬性並不會在這些目標中新增依附元件邊緣, 依附元件邊緣應由 deps 建立。這個項目中的項目 屬性只是字串。請記住,在這項屬性中加入目標時 表示共用資料庫會從該目標匯出符號。 cc_shared_library 邏輯實際上不會向連結器告知 都必須匯出。

可使用的語法如下:

//foo:__package__ 納入 foo/BUILD 的任何目標

//foo:__subpackages__,以因應 foo/BUILD 或任何其他目標 foo/bar/BUILD 以下的套件

roots

標籤清單;預設為 []

shared_lib_name

String;預設值為 ""

根據預設,cc_shared_library 會根據以下條件使用共用程式庫輸出檔案的名稱: 目標名稱和平台這包括副檔名,有時也會出現前置字元。 有時候,您可能不想使用預設名稱,例如載入 C++ 共用程式庫時 對於 Python 而言,預設的 lib* 前置字串通常不需要,因此您可以使用這個 屬性選擇自訂名稱。
static_deps

字串清單;預設值為 []

字串清單;預設值為 []

您想要傳送給連結器的任何其他標記。舉例來說 連結器知道透過 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, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
從目標清單及其轉換依附元件清單產生靜態程式庫。

產生的靜態程式庫會包含所列出目標的 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 功能啟用該 API動作中的工具是 藉由兩個引數呼叫,這個靜態程式庫可檢查重複符號和 如果檢查通過,就必須建立的檔案路徑。
  • 具有 symbol_check 功能新增封存工具旗標, 動作建立靜態資料庫,以致於無法對重複的符號執行動作。

引數

屬性
name

名稱;必選

此目標的專屬名稱。

deps

標籤清單;預設為 []

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

沒有提供任何物件檔案的依附元件 就不會包含在靜態值中 但這些標籤的標籤是在 linkdeps 輸出群組。

cc_test

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

cc_test() 規則會編譯測試。這裡是測試 是某些測試程式碼周圍的二進位包裝函式。

根據預設,C++ 測試是動態連結。
若要靜態連結單元測試,請 linkstatic=True。 我們可以說明測試需求的原因 linkstatic;這可能並不容易

隱含輸出目標

  • name.stripped (只會在明確要求時建構):移除 最新版本的二進位檔案strip -g 已在二進位檔上執行,以移除偵錯 符號。您可以透過指令列 --stripopt=-foo
  • name.dwp (僅在明確要求時建構):如果 Fission 已啟用:偵錯 適用於遠端部署二進位檔偵錯的資訊套件。其他: 空白檔案。

請參閱 cc_binary() 引數,除了該引數外, 而在測試期間,stamp 引數會預設為 0 cc_test含有額外的 (*_test) 屬性。

引數

屬性
name

名稱;必選

此目標的專屬名稱。

deps

標籤清單;預設為 []

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

可以是 cc_libraryobjc_library 目標。

您也可以將 將連接器指令碼 (.lds) 放入 deps 中,並在 linkopts
srcs

標籤清單;預設為 []

要處理的 C 和 C++ 檔案清單,用於建立程式庫目標。 這些是 C/C++ 來源檔案和標頭檔案,可以是非產生的 (一般來源檔案) 程式碼) 或由系統產生

所有 .cc.c.cpp 檔案都會 加以編譯如果檔案名稱位於 其他規則的outs,這個cc_library 會自動採用另一項規則

純組組合檔案 (.s、.asm) 不會預先處理,通常使用 組合器。預先處理的組合檔案 (.S) 會經過預先處理,通常建構在 C/C++ 編譯器

.h 檔案不會經過編譯,但可在 依據來源納入這項規則中的來源。.cc.h 檔案中可以直接加入 這些srcs、此規則的 hdrs,或任何 有規則列在 deps 引數中。

總共 #included 個檔案必須在以下示例中提及: 這項屬性或參照的 cc_libraryhdrs 屬性 ,如果是私人性質,則應列在 srcs 中 加入這個程式庫請參閱「標頭納入檢查」一節,瞭解 提供更詳細的說明

.so.lo.a 個檔案 預先編譯的檔案您的媒體庫可能會提供這些項目: srcs (如果使用我們不使用的第三方程式碼) 取得原始碼

如果 srcs 屬性包含其他規則的標籤, cc_library 會使用該規則的輸出檔案做為 下一步是使用 compile 方法 指定訓練方式,完成模型編譯這對產生一次性原始碼來說很實用 (與有時會超過 建議您導入 Starlark 規則類別,並使用 cc_common API)

允許的 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

... 以及產生這些檔案的任何規則 (例如 cc_embed_data)。 不同的擴充功能代表 改成 gcc 慣例

data

標籤清單;預設為 []

這個程式庫在執行階段所需的檔案清單。 查看關於「data」的一般留言 通常是由 大部分的建構規則

如果 data 是產生的檔案名稱,則 cc_library 規則會自動根據產生的 規則。

如果 data 是規則名稱,則 有 cc_library 項規則會自動採用該規則 而且該規則的outs會自動新增至 這個cc_library的資料檔案。

C++ 程式碼可存取這些資料檔案,如下所示:


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

標籤清單;預設為 []

將這些檔案傳送至 C++ 連接器指令。

舉例來說,可以在這裡提供已編譯的 Windows .res 檔案,以便嵌入 做為二進位目標

copts

字串清單;預設值為 []

將這些選項新增至 C++ 編譯指令。 取決於「化變數」替代和 Bourne 殼層權杖化

此屬性中的每個字串都會按照指定順序新增至 COPTS, 來編譯二進位目標標記只會在編譯這個目標時生效,不會 因此,請謹慎處理包含在其他地方的標頭檔案。 所有路徑均應以工作區為相對路徑,而非目前的套件。 在 third_party 以外不應使用這個屬性。

如果套件已宣告功能 no_copts_tokenization,Bourne 殼層權杖化功能僅適用於字串 其中包含一個「廠牌」變數。

defines

字串清單;預設值為 []

要新增至編譯行的定義清單。 取決於 「廠牌」替代和 Bourne 殼層權杖化。 每個字串都必須包含單一 Bourne 殼層符記 加在 -D 的前面,並新增至這個目標的編譯指令列。 並套用仰賴規則的每項規則請務必小心,因為這可能有 影響深遠的影響如有疑問,請將定義值加進 local_defines
dynamic_deps

標籤清單;預設為 []

以下是目前目標依附的其他 cc_shared_library 依附元件。

cc_shared_library 實作會使用 dynamic_deps (轉移之餘,即 dynamic_deps 目前目標的dynamic_deps),決定哪些cc_libraries 請勿連結遞移的 deps,因為已提供相關服務 由其他 cc_shared_library 產生。

hdrs_check

String;預設值為 ""

已淘汰,免人工管理。
includes

字串清單;預設值為 []

要新增至編譯行的包含 URI 清單。 套用至「Make 變數」替代。 每個字串前面都會加上套件路徑,並傳遞至 C++ 工具鍊 透過「include_paths」CROSSTOOL 功能。在 POSIX 系統上執行的工具鍊 一般特徵定義會產生 -isystem path_to_package/include_entry。 這個版本僅適用於符合下列條件的第三方程式庫 不符合 Google 撰寫 #include 陳述式的樣式。 與最佳化不同,系統會在這項規則中新增這些標記 並提供相關的所有規則(注意:而不是仰賴的規則!)成為 因為這樣可能帶來相當深遠的影響有疑慮就加上 「-我」標記為 COPTS

新增的 include 路徑會包括系統產生的檔案 來源樹狀結構中的檔案。

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

控管額外程式庫的連結作業。

根據預設,C++ 二進位檔會與 //tools/cpp:link_extra_lib 連結, 視標籤標記 //tools/cpp:link_extra_libs 而定。 如果沒有設定此標記,這個程式庫預設會空白。設定標籤標記 可連結選用的依附元件,例如惡意符號、攔截器的覆寫值 使用共用程式庫函式或特殊的執行階段程式庫 (如果是 Malloc 替換項目, 建議採用 malloc--custom_malloc)。將此屬性設定為 None 會停用這個行為。

linkopts

字串清單;預設值為 []

將這些標記新增至 C++ 連接器指令。 取決於 「廠牌」替代變數, Bourne 殼層權杖化展開標籤。 此屬性中的每個字串都加到 LINKOPTS 之前, 來連結二進位資料

這份清單中每個開頭不是 $- 的元素 假設為 deps 中目標的標籤。 該目標產生的檔案清單會附加至連結器 只要設定成「自動重新啟動」 和「在主機維護期間」選項即可如果標籤無效或 未在 deps 中宣告。

linkshared

布林值;預設值為 False

建立共用資料庫。 如要啟用這項屬性,請在規則中加入 linkshared=True。預設 這個選項就會停用

出現這個旗標,表示連結是透過 -shared 標記完成 新增至 gcc,產生的共用資料庫適合載入 Java 程式範例不過,基於建構目的,這個 API 永遠不會連結至 相依二進位檔,因為原定方法為透過 cc_binary 規則只有其他程式手動載入,因此 不應視為替代 cc_library 規則。為提高擴充性,建議您完全避免採用此方法, 讓 java_library 依附於 cc_library 規則 。

如果同時指定 linkopts=['-static']linkshared=True, 即可獲得一個完全獨立的單元如果您同時指定 linkstatic=Truelinkshared=True,您大多能獲得單價 獨立單元

linkstatic

布林值;預設值為 False

適用於 cc_binarycc_test:連結靜態的二進位檔 模式。cc_library.link_static:請參閱下方說明。

這個選項預設為 cc_binary,其餘則為關閉。

如果啟用此選項,且是二進位檔或測試項目,這個選項會指示建構工具 .a,盡可能避免使用 .so 的使用者程式庫。 系統程式庫,例如 libc (但「不是」C/C++ 執行階段程式庫; 如下所示) 仍會以動態方式連結, 我們沒有靜態資料庫因此,產生的執行檔仍會 不過,因此只能「幾乎」都是靜態資料。

連結執行檔的方法有三種:

  • 使用 Full_static_link 功能 STATIC,所有內容皆以靜態方式連結; 例如:「gcc -static foo.o libbar.a libbaz.a -lm」。
    啟用這個模式的方式,就是在fully_static_link features 屬性。
  • STATIC:以靜態方式連結所有使用者程式庫 (如果是 可用的版本),但系統程式庫 (不包括 C/C++ 執行階段程式庫) 會透過動態連結的方式連結 (例如「gcc foo.o libfoo.a libbaz.a -lm」。
    透過指定 linkstatic=True 即可啟用這個模式。
  • 動態版本:所有程式庫皆以動態方式連結 (如果動態版本是 可用),例如:「gcc foo.o libfoo.so libbaz.so -lm」。
    透過指定 linkstatic=False 即可啟用這個模式。

如果 linkstatic 屬性或 fully_static_linkfeatures」已用於 //third_party 以外的地方 請在規則附近留言說明原因

linkstatic 屬性如果用於 cc_library() 規則。 如果是 C++ 程式庫,linkstatic=True 表示只有 系統允許使用靜態連結,因此不會產生 .so。linkstatic=False 包含 但無法防止建立靜態資料庫這個屬性是用來控制 動態程式庫建立程序

在實際工作環境中,應該幾乎使用 linkstatic=False 建構的程式碼。 如果值為 linkstatic=False,建構工具會建立符號連結,指向 依賴 *.runfiles 區域的共用程式庫

local_defines

字串清單;預設值為 []

要新增至編譯行的定義清單。 取決於 「廠牌」替代和 Bourne 殼層權杖化。 每個字串都必須包含單一 Bourne 殼層符記 加在 -D 的前面,並新增至這個目標的編譯指令列。 而非依附關係
malloc

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

覆寫 Malloc 的預設依附元件。

根據預設,C++ 二進位檔會與 //tools/cpp:malloc 連結, 是空的程式庫,所以二進位檔最終會使用 libc malloc。 這個標籤必須參照 cc_library。如果是編譯非 C++ 如果發生下列情形,系統會忽略這個屬性的值: 已指定 linkshared=True

module_interfaces

標籤清單;預設為 []

檔案清單即為 C++20 模組介面。

C++ 標準對模組介面副檔名沒有限制

  • Clang 使用 cppm
  • GCC 可以使用任何來源副檔名
  • MSVC 使用 ixx

該標記會保護使用行為 --experimental_cpp_modules

nocopts

String;預設值為 ""

移除 C++ 編譯指令中的相符選項。 取決於 「廠牌」變數替代。 這個屬性的值會解讀為規則運算式。 符合這個規則運算式的任何現有 COPTS (包括規則的 copts 屬性中明確指定的值) 將會從「COPTS」中移除,以便編譯這項規則。 你不需要或使用這項屬性 third_party 以外的值。系統不會預先處理這些值 除了「廠牌」替代變數。
reexport_deps

標籤清單;預設為 []

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_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)

代表 C++ 工具鍊。

此規則負責:

  • 收集執行 C++ 動作所需的所有構件。做法是 例如 all_filescompiler_files linker_files 或其他結尾為 _files 的屬性)。這些 最常見的檔案群組發現了所有必要檔案。
  • 為 C++ 動作產生正確的指令列。方法是使用 CcToolchainConfigInfo 提供者 (請見下方說明)。

使用 toolchain_config 屬性設定 C++ 工具鍊。 另請參閱 第 頁 查看詳細的 C++ 工具鍊設定和工具鍊選擇說明文件。

使用 tags = ["manual"],以免建立及設定工具鍊 叫用 bazel build //... 時不需要使用

引數

屬性
name

名稱;必選

此目標的專屬名稱。

all_files

標籤;必選

顯示所有 cc_toolchain 構件。這些構件會新增為以下項目的輸入內容: Rules_cc 相關動作 (使用更精確的 屬性。Bazel 假設 all_files 是超集 所有其他構件屬性 (例如 linktamp 編譯需要一併編譯) 並連結檔案,因此需要 all_files)。

這是 cc_toolchain.files 包含的內容,全部 Starlark 都使用這個項目 管理 C++ 工具鍊的規則。

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

布林值;預設值為 False

已淘汰,免人工管理。
libc_top

標籤;預設為 None

這個集合會傳遞做為輸入內容的 libc 構件,用於編譯/連結動作。
linker_files

標籤;必選

包含連結動作所需的所有 cc_toolchain 構件。
module_map

標籤;預設為 None

要用於模組化版本的模組對應構件。
objcopy_files

標籤;必選

內含執行 objcopy 動作所需的所有 cc_toolchain 構件。
output_licenses

字串清單;預設值為 []

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 支援使用參數檔案連結動作,請設為 True。
toolchain_config

標籤;必選

提供 cc_toolchain_config_info 的規則標籤。
toolchain_identifier

String;預設值為 ""

用來比對此 cc_toolchain 與 crosstool_config.toolchain.

直到問題 #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)

已淘汰:規則為免人工管理,並將於日後移除。

引數

屬性
name

名稱;必選

此目標的專屬名稱。

fdo_prefetch_hints

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

代表位於工作區的 FDO 預先擷取提示設定檔。 範例:


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

引數

屬性
name

名稱;必選

此目標的專屬名稱。

profile

標籤;必選

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

fdo_profile

查看規則來源
fdo_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, memprof_profile, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

代表工作區中的 FDO 設定檔。 範例:


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

引數

屬性
name

名稱;必選

此目標的專屬名稱。

memprof_profile

標籤;預設為 None

MemProf 設定檔的標籤。設定檔應 .profdata 副檔名 (針對已建立索引/符號化的 Memprof) 設定檔),或是 ZIP 檔 (包含 memprof .profdata) 的.zip 副檔名 檔案。
profile

標籤;必選

FDO 設定檔或產生該設定檔的規則的標籤。FDO 檔案中的 以下擴充功能:.profraw (適用於未建立索引的 LLVM 設定檔)、.profdata (已建立索引的 LLVM) 設定檔、.zip,內含 LLVM profraw 設定檔、.afdo for AutoFDO 設定檔、.xfdo XBinary 設定檔。該標籤也可以指向 fdo_absolute_path_profile 規則。
proto_profile

標籤;預設為 None

protobuf 設定檔的標籤。

memprof_profile

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

代表工作區中的 MEMPROF 設定檔。 範例:


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

引數

屬性
name

名稱;必選

此目標的專屬名稱。

profile

標籤;必選

MEMPROF 設定檔的標籤。設定檔應 .profdata 副檔名 (針對已建立索引/符號化的 Memprof) 設定檔),或是 ZIP 檔 (包含 memprof .profdata) 的.zip 副檔名 檔案。 該標籤也可以指向 fdo_absolute_path_profile 規則。

propeller_optimize

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

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


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

引數

屬性
name

名稱;必選

此目標的專屬名稱。

cc_profile

標籤;必選

傳遞至各種編譯動作的設定檔標籤。這個檔案有 .txt 副檔名。
ld_profile

標籤;必選

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