bazel是Google開源的一款編譯工具,具有支援多種語言,編譯速度快,處理依賴友善,編寫編譯規則簡單的優點。
有人說,bazel是流氓工具,為什麼呢?因為它不僅QJ你們組,還QJ你的兄弟組。意思是說一個組用了bazel,其他組為了協同工作,也必須用bazel,否則作為一個項目整體沒法管理。
這在一定程度上是對的,因為一個項目想打包成一個整體,如果其中一部分使用bazel編譯,另外一部分寫makefile編譯,那麼這兩個部分沒法生成一個完整的動态連結庫給外界使用。
退而求其次,能不能接受一個項目提供多個動态連結庫打包呢?如果能接受,那麼在項目一部分使用bazel編譯,另一部分寫makefile編譯的情況下,也是可以管理的。因為使用bazel可以生成動态連結庫so檔案,makefile也可以,把兩個放一起,問題就解決了。
這篇文章簡單介紹使用bazel生成C++動态連結庫檔案的方法。
需要的前提知識有:
1. 熟悉gcc的編譯和連結指令;
2. 熟悉bazel的使用方法,知道WORKSPACE和BUILD檔案的作用;
3. 熟悉bazel的規則,比如cc_binary,cc_import,可以參考https://docs.bazel.build/versions/master/be/c-cpp.html
使用bazel生成動态連結庫檔案其實很簡單,使用cc_binary規則就可以了,如果你仔細閱讀bazel的C++規則檔案,你會知道隻要加入這樣的規則:
cc_binary(
name = "libmylib.so", #mylib是頭檔案的名字
srcs = ["mylib.cpp",
"mylib.h", #頭檔案和源檔案,必須都有
],
deps = ["//XX:XX", #依賴,注意要把頭檔案和源檔案中include的頭檔案所在的BUILD包都加進去
],
copts = ["-g", #編譯時候的指令
],
linkopts = ["-lstdc++", #連結時候的指令
],
linkshared = True,
linkstatic = True,
)
寫好上述規則後,在WORKSPACE目錄運作
bazel build //XX:libmylib.so
即可得到這個項目的動态編譯庫檔案。
檢視動态編譯庫檔案的連結檔案。在libmylib.so目錄下輸入
ldd libmylib.so
,即可檢視libmylib.so正常被調用需要在哪些位置找到哪些更底層的動态連結庫檔案,可以根據這個目錄在新環境裡安裝相應的依賴,使libmylib.so可以正常工作。