Bazel C++ 基礎(chǔ)

使用絕對路徑

包含的路徑是相對于工作區(qū)的根路徑。假設(shè)有以下的目錄結(jié)構(gòu):

[workspace]/
    WORKSPACE
    a/
        BUILD
        a.h
        a.cc
    b/
        BUILD
        b.h
        b.cc
        main.cc

如果b/main.cc需要包含b.h頭文件择份,我們需要?jiǎng)?chuàng)建以下的b/BUILD文件:

cc_library(
    name = "b",
    srcs = ["b.cc"],
    hdrs = ["b.h"],
)

cc_binary(
    name = "main",
    srcs = ["main.cc"],
    deps = [":b"],
)

b/main.cc可以這樣包含b.h

#include "b/b.h"

上面的頭文件包含路徑是相對于工作區(qū)根目錄的相對路徑菠赚。如果b/main.cc還要依賴a/a.h頭文件的話等太,我們還需要添加a/BUILD文件:

cc_library(
    name = "a",
    srcs = ["a.cc"],
    hdrs = ["a.h"],
    visibility = ["http://b:__pkg__"],
)

然后我們在b/BUILD添加依賴關(guān)系:

cc_binary(
    name = "main",
    srcs = ["main.cc"],
    deps = [
        ":b",
        "http://a",
    ],
)

b/main.cc代碼中也包含了a/a.h頭文件:

#include "a/a.h"

b/main.cc就可以正常使用a/a.hb/b.h中導(dǎo)出的符號了右核。

依賴傳遞

如果包含了一個(gè)頭文件半哟,那么需要將頭文件對應(yīng)的庫添加到依賴中溉苛。不過镜廉,只需有添加直接依賴的庫。假設(shè)三明治對應(yīng)的sandwich.h文件包含了面包對應(yīng)的bread.h文件愚战,同時(shí)bread.h又包含了面粉對應(yīng)的flour.h文件娇唯。但是,三明治sandwich.h文件并沒有直接包含面粉flour.h文件(三明治用戶當(dāng)然不關(guān)心面粉的事情)寂玲,因此BUILD文件可以這樣:

cc_library(
    name = "sandwich",
    srcs = ["sandwich.cc"],
    hdrs = ["sandwich.h"],
    deps = [":bread"],
)

cc_library(
    name = "bread",
    srcs = ["bread.cc"],
    hdrs = ["bread.h"],
    deps = [":flour"],
)

cc_library(
    name = "flour",
    srcs = ["flour.cc"],
    hdrs = ["flour.h"],
)

上面表示了sandwich三明治庫依賴bread面包庫塔插,bread又依賴flour對應(yīng)的面粉庫。

添加頭文件包含路徑

很多時(shí)候你可能并不希望基于工作區(qū)根路徑的相對路徑來包含每個(gè)頭文件拓哟。因?yàn)楹芏嘁呀?jīng)存在的第三方庫的頭文件包含方式并不是基于工作區(qū)的根路徑想许。假設(shè)有以下目錄結(jié)構(gòu):

[workspace]/
    WORKSPACE
    third_party/
        some_lib/
            include/
                some_lib.h
            BUILD
            some_lib.cc

Bazel希望用third_party/some_lib/include/some_lib.h方式包含some_lib.h,但是some_lib.cc可能跟希望用"include/some_lib.h"方式包含彰檬。為了使得包含路徑有效伸刃,需要在third_party/some_lib/BUILD文件中將some_lib/目錄添加到頭文件包含路徑的搜索列表中:

cc_library(
    name = "some_lib",
    srcs = ["some_lib.cc"],
    hdrs = ["some_lib.h"],
    copts = ["-Ithird_party/some_lib"],
)

這對于依賴的外部第三方庫特別有效,因?yàn)榭梢员苊庠陬^文件路徑中出現(xiàn)無關(guān)的external/[repository-name]/前綴逢倍。

包含外部庫:一個(gè)例子

假設(shè)使用了 Google Test捧颅。可以在WORKSPACE文件中使用new_開頭的倉庫相關(guān)的函數(shù)较雕,下載依賴的GTest代碼到當(dāng)前倉庫中:

new_http_archive(
    name = "gtest",
    url = "https://googletest.googlecode.com/files/gtest-1.7.0.zip",
    sha256 = "247ca18dd83f53deb1328be17e4b1be31514cedfc1e3424f672bf11fd7e0d60d",
    build_file = "gtest.BUILD",
)

創(chuàng)建gtest.BUILD文件碉哑,對應(yīng)Google Test的構(gòu)建配置文件挚币。配置文件中有幾個(gè)需要特別注意的地方:

  • gtest-1.7.0/src/gtest-all.cc文件已經(jīng)采用#include語法包含了gtest-1.7.0/src/目錄中其它*.cc文件,因此需要將它排除在外(也可以只包含它一個(gè)文件扣典,但是需要正確配置包含路徑)妆毕。
  • 它的頭文件在gtest-1.7.0/include/目錄,需要將它添加到頭文件包含路徑列表中
  • GTest依賴pthread多線程庫贮尖,通過linkopt選項(xiàng)指定笛粘。

最終的規(guī)則大概是這樣:

cc_library(
    name = "main",
    srcs = glob(
        ["gtest-1.7.0/src/*.cc"],
        exclude = ["gtest-1.7.0/src/gtest-all.cc"]
    ),
    hdrs = glob([
        "gtest-1.7.0/include/**/*.h",
        "gtest-1.7.0/src/*.h"
    ]),
    copts = [
        "-Iexternal/gtest/gtest-1.7.0/include"
    ],
    linkopts = ["-pthread"],
    visibility = ["http://visibility:public"],
)

這是有點(diǎn)混亂:所有以gtest-1.7.0為前綴的其實(shí)都是生成的臨時(shí)文件。我們可以通過new_http_archive函數(shù)中的strip_prefix屬性來忽略它:

new_http_archive(
    name = "gtest",
    url = "https://googletest.googlecode.com/files/gtest-1.7.0.zip",
    sha256 = "247ca18dd83f53deb1328be17e4b1be31514cedfc1e3424f672bf11fd7e0d60d",
    build_file = "gtest.BUILD",
    strip_prefix = "gtest-1.7.0",
)

現(xiàn)在gtest.BUILD簡潔多了:

cc_library(
    name = "main",
    srcs = glob(
        ["src/*.cc"],
        exclude = ["src/gtest-all.cc"]
    ),
    hdrs = glob([
        "include/**/*.h",
        "src/*.h"
    ]),
    copts = ["-Iexternal/gtest/include"],
    linkopts = ["-pthread"],
    visibility = ["http://visibility:public"],
)

現(xiàn)在cc_相關(guān)的規(guī)則可以通過//external:gtest/main引用GTest了湿硝。

例如:我們可以創(chuàng)建以下測試:

#include "gtest/gtest.h"

TEST(FactorialTest, Negative) {
  EXPECT_EQ(1, 1);
}

創(chuàng)建對應(yīng)的BUILD文件:

cc_test(
    name = "my_test",
    srcs = ["my_test.cc"],
    copts = ["-Iexternal/gtest/include"],
    deps = ["@gtest//:main"],
)

使用bazel test命令運(yùn)行測試薪前。

依賴預(yù)編譯的庫

如果要依賴一個(gè)已經(jīng)編譯好的庫(可能只有頭文件和對應(yīng)的*.so庫文件),可以使用cc_library規(guī)則包裝一個(gè)庫對象:

cc_library(
    name = "mylib",
    srcs = ["mylib.so"],
    hdrs = ["mylib.h"],
)

其它的目標(biāo)就可以依賴這個(gè)包裝的庫對象了关斜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末示括,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痢畜,更是在濱河造成了極大的恐慌垛膝,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丁稀,死亡現(xiàn)場離奇詭異吼拥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秃臣,“玉大人般贼,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長全肮。 經(jīng)常有香客問我,道長棘捣,這世上最難降的妖魔是什么辜腺? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮乍恐,結(jié)果婚禮上评疗,老公的妹妹穿的比我還像新娘。我一直安慰自己茵烈,他們只是感情好百匆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呜投,像睡著了一般加匈。 火紅的嫁衣襯著肌膚如雪存璃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天雕拼,我揣著相機(jī)與錄音纵东,去河邊找鬼。 笑死啥寇,一個(gè)胖子當(dāng)著我的面吹牛偎球,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辑甜,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼甜橱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了栈戳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤难裆,失蹤者是張志新(化名)和其女友劉穎子檀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乃戈,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褂痰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了症虑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩歪。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谍憔,靈堂內(nèi)的尸體忽然破棺而出匪蝙,到底是詐尸還是另有隱情,我是刑警寧澤习贫,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布逛球,位于F島的核電站,受9級特大地震影響苫昌,放射性物質(zhì)發(fā)生泄漏颤绕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一祟身、第九天 我趴在偏房一處隱蔽的房頂上張望奥务。 院中可真熱鬧,春花似錦袜硫、人聲如沸氯葬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溢谤。三九已至瞻凤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間世杀,已是汗流浹背阀参。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞻坝,地道東北人蛛壳。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像所刀,于是被迫代替她去往敵國和親衙荐。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理浮创,服務(wù)發(fā)現(xiàn)忧吟,斷路器,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評論 25 707
  • Ubuntu的發(fā)音 Ubuntu煌抒,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音厕倍。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,160評論 9 467
  • 動(dòng)態(tài)鏈接寡壮,在可執(zhí)行文件裝載時(shí)或運(yùn)行時(shí),由操作系統(tǒng)的裝載程序加載庫讹弯。大多數(shù)操作系統(tǒng)將解析外部引用(比如庫)作為加載過...
    小5筒閱讀 5,476評論 0 3
  • ?如果早知今日组民,我們又是否會選擇相識坏挠? 魚相忘乎江湖,人相忘乎道術(shù)邪乍。而相忘乎江湖降狠,正是最高深的道術(shù)。 相忘中庇楞,我還...
    聽風(fēng)記閱讀 1,240評論 0 2