C C++ 動態庫與靜態庫的製做與使用

靜態庫的用法

靜態庫的文件名 libxxx.a -->對應windows的.lib文件作靜態庫的命令:
C C++ 動態庫與靜態庫的製做與使用windows

使用靜態庫:
C C++ 動態庫與靜態庫的製做與使用ide

注意:-L的做用是告訴gcc你的libxxx.a放在了哪一個目錄裏;-l的做用是告訴gcc使用哪一個靜態庫。
舉個例子,目錄結果以下:
C C++ 動態庫與靜態庫的製做與使用函數

head.h
C C++ 動態庫與靜態庫的製做與使用3d

add.c
C C++ 動態庫與靜態庫的製做與使用blog

sub.c
C C++ 動態庫與靜態庫的製做與使用接口

mul.c
C C++ 動態庫與靜態庫的製做與使用內存

步驟1:在src目錄執行下面的命令,生產.o文件

C C++ 動態庫與靜態庫的製做與使用

執行後,在src目錄下生產了add.o,sub.o,mul.o三個文件it

步驟2:在src目錄執行下面的命令,生產libCalc.a文件

C C++ 動態庫與靜態庫的製做與使用

在src目錄執行下面的命令,把libCalc.a移動到上層的lib文件夾

C C++ 動態庫與靜態庫的製做與使用

執行後,在lib文件夾出現了libCalc.a編譯

main.c
C C++ 動態庫與靜態庫的製做與使用class

步驟4:在src的上層目錄,執行下面命令生產a.out文件

C C++ 動態庫與靜態庫的製做與使用

  • -I:指定頭文件所在的路徑
  • -L:指定靜態庫文件所在的路徑
  • -l:指定使用哪一個靜態庫

最後目錄結構以下:
C C++ 動態庫與靜態庫的製做與使用

動態庫的用法

動態庫的文件名 libxxx.so(對應windows的.dll文件) 編譯時,須要加【-fPIC】選項。它的做用是,編譯出與位置無關的代碼。由於動態庫在加載到下圖的共享庫區的時候,不必定加載到哪一個位置,因此加了-fPIC後,就記錄了每一個函數相對於這個動態庫頭地址的偏移,加載後動態庫在內存裏的頭地址是知道的,又知道了每一個函數相對於頭的偏移量,天然而然地就可以找到每一個函數在內存裏的位置了。
C C++ 動態庫與靜態庫的製做與使用

作靜態庫的命令(-shared):
C C++ 動態庫與靜態庫的製做與使用

用【ldd】命令查看編譯出來的可執行文件文件
C C++ 動態庫與靜態庫的製做與使用

結果以下:
C C++ 動態庫與靜態庫的製做與使用
發現【libCalc.so => not found】

解決辦法1:

把作好的動態庫libCalc.so拷貝到【/lib】或者【/usr/lib】下,也能夠用ln作軟硬鏈接:把當前目錄下的lib目錄下的libCalc.so連接到/lib下
C C++ 動態庫與靜態庫的製做與使用

結果以下:
C C++ 動態庫與靜態庫的製做與使用

發現軟鏈接是紅色的,也就是不能使用的意思,錯誤在於./lib/libCalc.so這個路徑是不存在的,緣由在於上面的命令使用的是相對路徑,改爲絕對路徑就OK了,命令以下:
C C++ 動態庫與靜態庫的製做與使用

結果以下:
C C++ 動態庫與靜態庫的製做與使用
發現軟鏈接是綠色的了,說明庫可使用了。

再用【ldd】命令查看編譯出來的可執行文件文件 ldd a.out, 結果以下:
C C++ 動態庫與靜態庫的製做與使用

可是這種方法不推薦使用。理由是,放在了系統的動態庫目錄裏,容易和別的庫重複,發生衝突。

解決辦法2:告訴系統,給我加一個動態庫的路徑,這個是最好的辦法。

首先編輯/etc/ld.so.conf文件,添加你本身的庫的路徑 而後,執行:【sudo ldconfig】,就OK了。

靜態庫和動態庫的特色:

  • 靜態庫:
    編譯的時候,直接把靜態庫的代碼直接編譯到目標文件
    執行速度快,不須要在執行的時候加載動態庫
    庫文件修改後,必須從新編譯使用庫的代碼

  • 動態庫編譯的時候,不把靜態庫的代碼直接編譯到目標文件執行速度慢,在執行的時候須要加載動態庫庫文件修改後,通常不須要從新編譯使用庫的代碼,只有在庫的接口改變時,才須要從新編譯使用庫的代碼。
相關文章
相關標籤/搜索