動態庫和靜態庫

1. 概念介紹html

我理解的庫分爲數據庫和程序庫,通常來講庫是被調用的,不能夠單獨執行。數據庫

數據庫也包括對數據的操做部分,可是主要圍繞數據;函數

程序庫就是提供接口、專門實現某些功能的函數。spa

 

程序庫(函數庫)分爲靜態庫和動態庫。.net

前者在連接的時候加入到執行代碼中,連接以後能夠刪除,不會影響程序執行;htm

後者在連接時只是指定了庫的位置,不會加入代碼中,程序執行前刪除動態庫會出問題。blog

 

動態庫的優勢:索引

  • 是代碼(什麼意思???)
  • 易於模塊更新,更新庫時源程序不須要從新編譯
  • 節省大量空間!

 

 

2. 靜態庫的生成和使用接口

①編譯get

g++ -c print_hello.cpp print_world.cpp

把源文件cpp編譯成多個.o靜態庫,能夠一次編譯多個;
使用gcc或者g++,默認生成的.o文件就是靜態庫

②打包

ar csrv libprint_helloworld.a print_hello.o  print_world.o

ar可集合許多文件成爲單一的備存文件,全部成員文件皆保有原來的屬性與權限;
該命令將目標文件1~n加入到指定的靜態庫中。若是該靜態庫不存在,則建立靜態庫文件。
靜態庫.a文件,是一些.o目標文件的集合,有.o生成.a的過程,其實就是一個打包

  • 參數r:把列表中的目標文件加入到靜態庫中
  • 參數c:若指定的靜態庫不存在,則建立該庫文件
  • 參數s:更新靜態庫文件的索引,是指包含新加入的目標文件的內容

③連接

g++ -o main main.cpp -L./ -lprint_helloworld

注意這裏的格式:
a. -L緊跟着路徑
b. -l+靜態庫名,不要後綴.a
使用.a靜態庫連接成可執行文件,連接以後能夠刪除全部的.o和.a靜態庫文件;
靜態庫在程序連接的時候使用,鏈接器會將程序中使用到的函數的代碼從庫文件拷貝到可執行文件中
一旦連接完成,在程序執行的時候就不須要靜態庫了。

 

 

3. 動態庫的生成和使用

①生成.o靜態庫:

g++ -c -fPIC print_hello.cpp print_world.cpp

②製做動態庫
g++ -shared  -o libprint_helloworld.so print_hello.cpp print_world.cpp
-fPIC用於生成與位置無關的代碼,-shared用於將位置無關的代碼製做成動態庫。

③連接

g++ -o main main.cpp -L. -lprint_helloworld

上面的一些規則,好比.so文件的開頭是lib,-L後面緊跟着路徑,-l後面+動態庫可是不加後綴……都是爲了保證這一步連接能夠順利完成!

假如這一步連接隨意一點:g++ -o main main.cpp print_helloworld.so,那麼上面的規則都不須要!

④添加進庫/usr/lib/

上面完成以後,直接執行:.main會出錯——找不到庫文件。

還須要把共享庫添加進合適的位置: sudo cp print_helloworld.so /usr/lib/

由於雖然連接的是當前目錄的libprint_helloworld.so,可是執行的時候確實從共享庫文件夾裏面尋找

我猜這樣作的機制,是爲了鼓勵人們把共享庫放到你們均可以夠得着的地方。

 

 

4. 直接編譯+連接
連接的時候不必定使用庫文件,還能夠直接使用cpp文件!
g++ -o main main.cpp print_hello.cpp print_world.cpp

默認是先編譯生成靜態庫.o,而後再進行連接,連接完畢以後刪除.o文件。

 

 

參考連接:

https://my.oschina.net/daowuming/blog/775068

https://www.cnblogs.com/li-hao/archive/2012/03/01/2376227.html

相關文章
相關標籤/搜索