bazel生成C 動態鏈結庫so檔案

2021-08-21 21:05:05 字數 1100 閱讀 2162

bazel是google開源的一款編譯工具,具有支援多種語言,編譯速度快,處理依賴方便,編寫編譯規則簡單的優點。

有人說,bazel是流氓工具,為什麼呢?因為它不僅qj你們組,還qj你的兄弟組。意思是說乙個組用了bazel,其他組為了協同工作,也必須用bazel,否則作為乙個專案整體沒法管理。

這在一定程度上是對的,因為乙個專案想打包成乙個整體,如果其中一部分使用bazel編譯,另外一部分寫makefile編譯,那麼這兩個部分沒法生成乙個完整的動態鏈結庫給外界使用。

退而求其次,能不能接受乙個專案提供多個動態鏈結庫打包呢?如果能接受,那麼在專案一部分使用bazel編譯,另一部分寫makefile編譯的情況下,也是可以管理的。因為使用bazel可以生成動態鏈結庫so檔案,makefile也可以,把兩個放一起,問題就解決了。

需要的前提知識有:

1. 熟悉gcc的編譯和鏈結命令;

2. 熟悉bazel的使用方法,知道workspace和build檔案的作用;

3. 熟悉bazel的規則,比如cc_binary,cc_import,可以參考

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即可得到這個專案的動態編譯庫檔案。

檢視動態編譯庫檔案的鏈結檔案。在libmylib.so目錄下輸入ldd libmylib.so,即可檢視libmylib.so正常被呼叫需要在哪些位置找到哪些更底層的動態鏈結庫檔案,可以根據這個目錄在新環境裡安裝相應的依賴,使libmylib.so可以正常工作。

so動態鏈結庫生成 呼叫

linux下檔案的型別是不依賴於其字尾名的,但一般來講 o,是目標檔案,相當於windows中的.obj檔案 so 為共享庫,是shared object,用於動態連線的,和dll差不多 a為靜態庫,是好多個.o合在一起,用於靜態連線 1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。這裡...

GCC編譯生成動態鏈結庫 so檔案

動態庫 so在linux下用c和c 程式設計時經常會碰到,最近在 找了幾篇文章介紹動態庫的編譯和鏈結,總算搞懂了這個之前一直不太了解得東東,這裡做個筆記,也為其它正為動態庫鏈結庫而苦惱的兄弟們提供一點幫助。1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。這裡有乙個標頭檔案 so test...

linux c 動態鏈結庫so編寫

linux下的動態鏈結庫是.so檔案,即 shared object,下面是乙個簡單的例子說明如何寫.so以及程式如何動態載入.so中的函式和物件。testso.h ifndef testso h define testso h extern c endif testso h testso.cpp ...