1 靜態庫
靜態庫就是目標文件的集合,以.a結尾。靜態庫在程序鏈接的時候使用,鏈接器會將程序中使用到的函數的代碼從
庫文件中拷貝到應用程序中去(a.out)。一旦鏈接完成,那麼在執行程序時就不需要該靜態庫了。由於每個使用靜
態庫的應用程序(a.out)都需要拷貝所用函數的代碼,所以靜態鏈接的文件會比較大。
1.1 靜態庫的創建
1)編輯.c和.h文件
2)編譯生產目標文件:gcc -c xxx.c -o xxx.o
gcc -c yyy.c -o yyy.o
...
3)打包成靜態庫文件:ar -r libxxxxxxxxx.a xxx.o yyy.o
-r:將目標文件插入到靜態庫中,已存在則更新
1.2 靜態庫的使用
1)直接法
gcc xxx.c libxxxxx.a
2)環境變量法
export LIBRARY_PATH=.:$LIBRARY_PATH
(聲明定義) 環境變量的名稱=.:原有值(取原有值只要在變量的前面加一個$符號)
gcc xxx.c -lxxxxx
3)參數法
gcc main.c -lmy -L./
2 共享庫
共享庫在程序鏈接時,並不像靜態庫那樣拷貝使用函數的代碼,而只是做一些標記,然後在程序啓動的時,動態加載所
需要的共享庫。所以當應用程序運行時,任然需要共享庫的支持。共享庫鏈接出來的a.out要比靜態庫鏈接出來的a.out
要小。
2.1 共享庫的創建
1)編輯.c .h
2)編譯生成目標文件 gcc -c -fpic xxx.c -o xxx.o
gcc -c -fpic yyy.c -o yyy.o
......
3)鏈接生產共享庫文件 gcc -shared xxx.o yyy.o -o libxxxx.so
gcc -shared -fpic xxx.c yyy.c -o libxxxx.so
2.2使用共享庫
1)直接法
gcc xxx.c libxxxxx.so
2)環境變量法
export LIBRARY_PATH=.:$LIBRARY_PATH
(聲明定義) 環境變量的名稱=.:原有值(取原有值只要在變量的前面加一個$符號)
gcc xxx.c -lxxxxx
3)參數法(推薦)
gcc main.c -lmy -L./
2.3 運行
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
LD_LIBRARY_PATH:指定共享庫加載目錄
【總結】靜態庫佔用的空間大,不易修改,但執行效率高
共享庫佔用的空間小,易於修改,但執行效率低
需要使用的命令:
ar:打包
nm:可以查看目標文件(.o)、可執行文件(a.out)、靜態庫文件(.a)、共享庫文件(.so),他們中的所有的符號
ldd:可以用來查看可執行文件(a.out)和共享庫文件(.so)的動態依賴
objdump:顯示二進制模塊的彙編信息(查看代碼的執行效率)
靜態庫和共享庫-Linux/Unix
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.