歡迎您光臨本站 註冊首頁

linux庫基礎(靜態,動態)

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

1,庫的命名和編號約定:
庫名都以lib開頭
庫文件名都.a(代表存檔,archive)為靜態庫,以.so結尾的庫為動態庫.
編號約定 library_name.major_num.minor_num.patch_num.分別為“庫名.主版本
號.次版本號.補丁級別號".
2,nm命令:
命令nm列出編入目標文件或二進位文件的所有的符號.可以查看程序調用什麼函
數,也可以查看給定的庫或目標文件是否提供了所需的函數.
nm [options] file
關於參數和更詳細介紹可以參看man手冊.
3,ar命令:
用來操作高度結構化的存檔文件.可以用來創建靜態庫,創建,維護符號名的交
叉索引表.
ar [dumqrtx] [member] archive files...
4,ldd命令
ldd [options] file
ldd輸出file所要求的共享庫的名字.
5,ldcofig
ldconfig [options] [libs]
決定位於目錄/usr/lib和/lib下共享庫所需的運行的鏈接,這些鏈接在命令行上
的libs指定並被保存在/etc/ld.so.conf中.命令ldconfig和動態鏈接/裝載工具
ld.so協同工作,一起來創建和維護對最新版本共享庫的鏈接.
6,動態鏈接器/載入器ld.so使用兩個環境變數:
$LD_LIBRARY_PATH,一個由冒號分隔的目錄清單,在這些目錄下搜索運行時的共享
庫.
$LD_PRELOAD ,一個由空格分隔的,附加的,用戶指定的共享庫,在其它所有庫加
載之前載入.
還有,除了標準目錄/usr/lib和/lib以外,清單/etc/ld.so.conf中列出了鏈
接/載入器搜索共享庫時要查看的目錄.
7,編寫使用靜態庫
1》把代碼編譯為目標文件形式:
$ gcc -c libxxx.c -o libxxx.o
2》用工具ar創建一個存檔文件
$ ar rcs libxx.a libxxx.o
使用時注意-static項


如: $ gcc test.c -o test -static -L. -lxxx
在當前命令下查找庫文件libxxx
8,編寫使用共享庫
共享庫好處:1,因為並沒有被包含進其它各個文件,項目佔用磁碟空間少.
就像不是每個人都去買一份遊戲光碟,而是這些人只買一個,然後,可以選擇裝在
各自的機器上.
2,佔用內存資源也較少,因為同上理,它只向內存中載入一次,供其它來使用.
3,代碼維護簡單,有時只需要更新類庫就可以了,不用大動干戈去重新編譯所
有.
創建共享庫:
1,編譯目錄時使用gcc的-fPIC選項,這能產生與位置無關的代碼並能載入到任
何地址...神奇..
2,使用gcc的-shared 和 -soname選項
3,使用gcc的 -wl選項把參數傳遞給鏈接器ld.
4, 使用gcc的 -l 選項顯式的鏈接C庫,以保證可以得到所需的啟動
(startup)代碼,從而避免程序在使用不同的,可能是不兼容的C庫的系統上不能
啟動執行.
編譯:
$ gcc -fPIC -g -c libxxx.c -o libxxx.o
鏈接庫:
$ gcc -g -shared -Wl,-soname,libxxx.so -o libxxx.so.1.0.0 libxxx.o
符號鏈接:
$ ln -s libxxx.so.1.0.0 libxxx.so
9,ld 動態載入共享對象
1,載入共享對象:
void *dlopen(const char *filename ,int flag);
以flag指定的模式載入由filename指定的共享對象.filename可以為絕對路徑
名,一個文件名,或NULL.如果NULL,打開當前執行的文件,即你的應用程序.如
果是文件名,從以下搜索:
$LD_LIBRARY_PATH, /etc/ld.so.cache, /usr/lib, /lib
2,使用共享對象
void *dssym(void *handle, char *symbol);
3,檢查錯誤:
const char *dlerror(void);
4,卸載共享對象:
int dlclose(void *handle);

本文出自 「WIK」 博客,請務必保留此出處http://noyear.blog.51cto.com/819034/399274


[火星人 ] linux庫基礎(靜態,動態)已經有517次圍觀

http://coctec.com/docs/linux/show-post-49480.html