linux下的靜態庫和動態庫

2022-02-04 05:37:05 字數 1551 閱讀 1486

一、linux下的靜態庫

靜態庫中的被呼叫的函式的**會在編譯時一起被複製到可執行檔案中去的!!可執行檔案在執行不需要靜態庫的存在!

二、linux下動態庫的構建和使用

1、動態庫的構建

gcc  -fpic  -shared    -o  lib庫名.so   原始檔列表

例:gcc   -fpic  -shared  -o  libmylib.so  max.c  min.c

2、動態庫使用

gcc    -o  最終的可執行檔案  原始檔列表  -l 動態庫的目錄  -l庫名

例子:已經將int  getmax(int,int)和getmin(int,int)打包在了libmylib.so中了,現在你即可把libmylib.so複製希望用你的庫函式的人了!!

使用你的庫函式的人可能回這樣使用:

int getmax(int,int);

int main()

執行該命令:gcc  -o  test  test.c 會報錯:提示找不到getmax;

正確的命令:gcc  -o  test test.c  -l libmylib.so存放的目錄   -lmylib

錯誤的寫法:gcc  -o  test test.c  -l libmylib.so存放的目錄   -llibmylib.so

檢視動態庫中的標號:

readelf  -s  動態庫名 

檢視可執行檔案執行時所依賴的動態庫:

(1)ldd  可執行檔名

(2)readelf  -d   可執行檔名|grep  shared

3、動態鏈結的可執行檔案的執行(任選一種即可)):解決的是可執行檔案在執行時找動態庫

(1)將動態庫複製到/lib或/usr/lib目錄下;(在嵌入式開發,推薦用此方法!)

命令:正確:sudo  cp  libmylib.so  /lib/ 

錯誤:sudo  cp  libmylib.so  /lib/mylib.so

錯誤:sudo  cp  libmylib.so  /lib/libmylib

(2)將動態所在目錄路徑新增到環境變數ld_library_path

例如:     

export  ld_library_path=動態庫所在的目錄:$ld_library_path

如果需要ld_library_path一直生效,則需把上面的語句新增到~/.bashrc檔案中末尾去。

命令:gedit   ~/.bashrc

偷懶的辦法(慎用):

echo  export ld_library_path=$pwd:\$ld_library_path>>~/.bashrc

(3) 將動態所在的目錄新增到/etc/ld.so.conf中,啟動會自動載入/etc/ld.so.conf配檔案,如果需要立即生效,執行命令:ldconfig

命令:sudo gedit  /etc/ld.so.conf

三、靜態庫、動態庫使用上的區別

靜態庫被呼叫的**生成可執行檔案時會被立即複製到執行性檔案中去;

動態庫被呼叫的**在可執行檔案執行時才會被載入到可執行檔案中去。

linux 下靜態庫和動態庫

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該 靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。本文主要通過舉例來說明在 linux中如何建立...

linux下的靜態庫和動態庫

庫是什麼?在我們實際程式設計中,經常會引入各種庫函式,那麼庫是什麼?從本質上來說是一種可執行 的二進位制格式,可以被載入記憶體中執行。庫分靜態庫和動態庫兩種。靜態庫 linux下靜態庫的名字一般是lib a,為庫的名字。利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標 中,...

linux下的靜態庫和動態庫

意義 為了避免 的重寫率,我們可以將已經寫好的 形成乙個庫,當我們再次用到的時候可以直接呼叫,而不是重新去寫,即 站在巨人的肩膀上 linux下有兩種庫 一 靜態庫 準備工作 int swap int x,int y include int main 1 將我們需要的函式生成乙個.o 檔案 root...