linux下的靜態庫和動態庫
阿新 • • 發佈:2017-09-24
列表 可執行文件 運行時 打包 文件的 ade 命令 div library 一、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復制希望用你的庫函數的人了!!
使用你的庫函數的人可能回這樣使用:
//test.c
int getMax(int,int);
int main()
{
int x,y;
int max;
scanf(“%d%d”,&x,&y);
max=getMax(x,y);//getMax是在你的庫函數中已經實現了的,所以不用別人在實現了,直接拿來用就行了!!
printf(“max=%d\n”,max);
return 0;
}
執行該命令: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下的靜態庫和動態庫