一、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...