Bazel使用 編譯C 專案

2021-10-23 11:04:23 字數 4163 閱讀 8517

官網:

github:

sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python3
安裝程式

按如下方式執行bazel安裝程式:

$chmod +x bazel--installer-linux-x86_64.sh

$./bazel--installer-linux-x86_64.sh --user

該–user標誌將bazel安裝到home/bin系統上的目錄,並設定.bazelrc路徑home/.bazelrc。

使用該–help命令可以檢視其他安裝選項。

export path="$path:$home/bin"
您也可以將此命令新增到您的~/.bashrc檔案中。

$gedit ~/.bashrc
開啟.bashrc檔案,並新增

export path="$path:$home/bin"
examples

└── cpp-tutorial

├──stage1

│ └── main

│ ├── build

│ ├── hello-world.cc

│ └── workspace

├──stage2

│ ├── main

│ │ ├── build

│ │ ├── hello-world.cc

│ │ ├── hello-greet.cc

│ │ ├── hello-greet.h

│ └── workspace

└──stage3

├── main

│ ├── build

│ ├── hello-world.cc

│ ├── hello-greet.cc

│ └── hello-greet.h

├── lib

│ ├── build

│ ├── hello-time.cc

│ └── hello-time.h

└── workspace

可以看到分成了3組檔案,分別對應本文中的3個例子。在第乙個例子中,我們首先學習如何構建單個package中的單個target。在第二個例子中,我們將把整個專案拆分成單個package的多個target。第三個例子則將專案拆分成多個package,用多個target編譯。

首先進入到cpp-tutorial/stage1目錄下,然後執行以下指令:

$ bazel build //main:hello-world
注意target中的//main:是build檔案相對於workspace檔案的位置,hello-world則是我們在build檔案中命名好的target的名字。

bazel將編譯的輸出放在專案根目錄下的bazel-bin目錄下,可以看一下這個目錄,理解一下bazel的輸出結構。

測試剛剛生成的二進位制檔案:

$ bazel-bin/main/hello-world
單個target的方式對於小專案來說是高效的,但是對於大專案來說,你可能會想把它拆分成多個target和多個package來實現快速增量的編譯(這樣就只需要重新編譯改變過的部分)。

首先我們來嘗試著把專案拆分成兩個target。看一下cpp-tutorial/stage2/main目錄下的build檔案,它是這樣的:

cc_library(

name = "hello-greet",

srcs = ["hello-greet.cc"],

hdrs = ["hello-greet.h"],

)cc_binary(

name = "hello-world",

srcs = ["hello-world.cc"],

deps = [

":hello-greet",],)

我們看到在這個build檔案中,bazel首先編譯了hello-greet這個庫(利用bazel內建的cc_library編譯指令),然後編譯hello-world這個二進位制檔案。hello-world這個target的deps屬性告訴bazel,要構建hello-world這個二進位制檔案需要hello-greet這個庫。

好,讓我們編譯一下新的版本。進入到cpp-tutorial/stage2目錄下然後執行以下指令:

現在又可以測試剛剛生成的二進位制檔案了:

$ bazel-bin/main/hello-world
注意,如果你現在修改一下hello-greet.cc然後重新編譯整個專案的話,bazel其實只會編譯修改過的那個檔案。

我們現在再將專案拆分成多個package。看一下cpp-tutorial/stage3目錄下的內容:

└──stage3

├── main

│ ├── build

│ ├── hello-world.cc

│ ├── hello-greet.cc

│ └── hello-greet.h

├── lib

│ ├── build

│ ├── hello-time.cc

│ └── hello-time.h

└── workspace

注意到我們現在有兩個子目錄了,每個子目錄中都包含了build檔案。因此,對於bazel來說,整個工作區現在就包含了兩個package:lib和main。

lib/build檔案長這樣:

cc_library(

name = "hello-time",

srcs = ["hello-time.cc"],

hdrs = ["hello-time.h"],

visibility = ["//main:__pkg__"],

)

main/build檔案長這樣:

cc_library(

name = "hello-greet",

srcs = ["hello-greet.cc"],

hdrs = ["hello-greet.h"],

)cc_binary(

name = "hello-world",

srcs = ["hello-world.cc"],

deps = [

":hello-greet",

"//lib:hello-time",],)

可以看出hello-world這個mainpackage中的target依賴於lib package中的hello-time target(即target label為://lib:hello-time)- bazel是通過deps這個屬性知道自己的依賴項的。

注意到lib/build檔案中我們將hello-time這個target顯式可見了(通過visibility屬性)。這是因為預設情況下,targets只對同乙個build檔案裡的其他targets可見(bazel使用target visibility來防止像公有api中庫的實現細節的洩露等情況)。

好,讓我們編譯一下新的版本。進入到cpp-tutorial/stage3目錄下然後執行以下指令:

現在又可以測試剛剛生成的二進位制檔案了:

$ bazel-bin/main/hello-world
參考:

使用Bazel構建C C 專案

這是關於bazel的第二篇blog,前一篇寫了安裝 配置相關的東西,這一篇則是4個逐步推進的例子,改編自官方demo 以及相應的概念 文件鏈結等。目錄即使是bazel build官方文件,也不明確區分target和rule字眼,可以認為是乙個意思 大體上,bzl相當於.cmake檔案,build相當...

bazel 編譯多目標

demo2 使用bazel編譯多目標示例,乙個bianry,乙個library。本例和demo1類似,差異僅在於build檔案。cc library name hello func srcs func.cpp hdrs func.hpp cc binary name hello world srcs...

c 編譯使用

檢視libso相關的版本 確保當前路徑有cmakelists.txt檔案 新建build資料夾,編譯出makefile cd build cmake 編譯bin檔案make jcmake安裝方法 alias別名設定 run.sh demo vc的呼叫指令碼 中有的export先執行一下 ldd de...