C++ 和 Bazel

回報問題 查看原始碼 夜間 7.2 7.1 7.0 6.5 6.4

本頁面含有可協助您在 C++ 專案中使用 Bazel 的資源。連結 教學課程、建構規則,以及有關建構 C++ 的其他資訊 可在專案中使用 Bazel 執行

使用 Bazel

下列資源可協助您在 C++ 專案中使用 Bazel:

最佳做法

除了一般 Bazel 最佳做法以外,你還可以參閱下文 C++ 專案特有的最佳做法

BUILD 檔案

建立 BUILD 檔案時,請遵循下列規範:

  • 每個 BUILD 檔案都應包含一個 cc_library 目錄中每個編譯單元的規則目標。

  • 建議您盡可能將 C++ 程式庫精細化 以盡可能提高增量性及平行處理建構作業。

  • 如果 srcs 中只有一個來源檔案,請將程式庫命名為 C++ 檔案名稱這個程式庫應包含 C++ 檔案,任何相符的項目 標頭檔案以及程式庫的直接依附元件。例如:

    cc_library(
        name = "mylib",
        srcs = ["mylib.cc"],
        hdrs = ["mylib.h"],
        deps = [":lower-level-lib"]
    )
    
  • 請在檔案中每個 cc_library 目標使用一個 cc_test 規則目標。為 目標 [library-name]_test 和來源檔案 [library-name]_test.cc。 例如,針對上述 mylib 程式庫目標的測試目標,可能會 如下所示:

    cc_test(
        name = "mylib_test",
        srcs = ["mylib_test.cc"],
        deps = [":mylib"]
    )
    

包含路徑

納入路徑時,請遵守下列規範:

  • 將所有的 include 路徑設為與工作區目錄相對應的路徑。

  • 使用引用的 include (#include "foo/bar/baz.h") 做為非系統標題,不要使用 角括號 (#include <foo/bar/baz.h>)。

  • 避免使用 UNIX 目錄快速鍵,例如 . (目前目錄) 或 .. (父項目錄)。

  • 舊版或 third_party 程式碼,且需要將指標指向外部 外部存放區等專案存放區 包括要求前置字串 請使用 include_prefixstrip_include_prefix cc_library 規則目標的引數。

工具鍊功能

下列選用功能 可改善 C++ 專案的健全度您可使用 --features指令列標記或 features 屬性 repopackagecc_* 規則:

  • parse_headers 功能可讓 C++ 編譯器剖析 (但不編譯) 建構目標及其依附元件中的所有標頭檔案 使用 --process_headers_in_dependencies 旗標。這樣有助於找出僅限標頭程式庫中的問題,並確保 標頭彼此獨立且獨立於 包含。
  • layering_check 功能會強制要求目標只包含標頭 提供的直接依附元件預設工具鍊支援這項功能 功能,以 clang 做為編譯器的 Linux。