C/C++庫文件的生成與使用

爲什麼要用庫文件?

  1. 爲了保密(機密性)
  2. 提高代碼重用率,提升可擴展性(靈活性)
  3. 方便coders間的分工與合作,提高開發效率(高效開發)
  4. 保密的同時,清晰的結構也增加了可讀性(知道接口作用即可)(可讀性)

庫文件的種類?

  1. 靜態庫
    顧名思義,靜態庫就是靜止的,何謂靜止?將編譯生成的庫文件所依賴的目標文件.o打包(這時候就是靜態庫),在可執行文件的編譯階段,鏈接剛剛生成的靜態庫(靜態鏈接),這個可執行文件後續的運行於所依賴的靜態庫沒關係了。換句話說,這會刪了靜態庫對剛剛的可執行文件是沒有影響的。
    靜態庫的後綴是.a、.lib
    特點:生成可執行文件前完成鏈接、移植方便、浪費空間。

  2. 動態庫
    瞭解了靜態庫,不難發現動態庫是對靜態庫的一個補充。與創建靜態庫不同的是,不需要打包工具(ar、lib.exe),直接使用編譯器即可創建動態庫。
    靜態庫的後綴是.so、.dll
    特點:執行時鏈接、多次調用只有一份拷貝、節約空間。

linux下簡單的用例

IDE提高編碼效率的同時,卻讓coders忽視了更加底層的機制。有人說沒必要,我想說,碼農萬歲。
這個博文只介紹linux下兩件事,rt,庫的生成和使用。其實不寫太具體,無非就是各種命令,重要的思想。

  1. 靜態庫生成使用
    上邊說過了,靜態庫也要依賴一些文件,把所依賴的文件編譯生成目標文件,然後打包成一個文件,就是靜態庫。可以這樣寫代碼:
//沒有使用makefile格式,重要的是思想^_^
//func1.c, func2.c func1.h func2.h是庫所依賴的文件
//linux下編譯他們,生成目標文件
    g++ -c -o lib1.o func1.c
    g++ -c -o lib2.o func2.c

//將lib1.o lib2.o打包成靜態庫,xxx是你的庫名
    ar rcs libxxx.a lib1.o lib2.o

//main.c是需要引用剛剛生成庫的文件,是可運行的(有main函數),生成target後,如果把libxxx.a刪除,不影響target執行。
    g++ -o target main.c -static -L ./ -lxxx

//參數不知啥意思就man一下,如man g++,這也是linux方便的地方之一
  1. 動態庫生成使用
    動態庫不需要打包,但是也有生成一步。
//沒有使用makefile格式,重要的是思想^_^
//func1.c, func2.c func1.h func2.h是庫所依賴的文件
//linux下編譯他們,生成目標文件
    g++ -c -o lib1.o func1.c
    g++ -c -o lib2.o func2.c

//將lib1.o lib2.o生成動態庫,xxx是你的庫名
    g++ -shared -fPIC -o libxxx.so lib1.o lib2.o

//main.c是需要引用剛剛生成庫的文件,是可運行的(有main函數),生成target後,如果把libxxx.a刪除,將會影響target執行。
    g++ -o target main.c -static -L $(INCLUDE) -lxxx -I $(HEADER)
    //$(INCLUDE)是.so的路徑,$(HEADER)是.so依賴文件頭文件路徑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章