国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Linux下的靜態庫和動態庫

2019-11-08 03:01:33
字體:
來源:轉載
供稿:網友

linux下有靜態鏈接庫和動態鏈接庫兩種,本文就其區別,生成靜態庫動態庫的有關gcc命令以及生成靜態庫動態庫的方法作一介紹。

一.靜態庫和動態庫的區別:

1.靜態鏈接庫的后綴名是.a,動態鏈接庫的后綴名是.so;

2.靜態鏈接庫是指程序在編譯鏈接的過程中所有使用到的函數庫都會被加載到目標文件中,這種處理方式的優點是編譯后的執行程序不需要外部函數庫的支持,同樣的這種處理方式既是它的優點,同時也是它的缺點,那就是如果靜態函數庫改變了此時的程序就必須重新進行編譯鏈接。

3.動態庫相對靜態函庫來說動態庫的體積相對較小,是因為動態函數庫在編譯的時候并沒有加載到目標文件中。由于動態函數庫沒有整合到你的程序中,是在程序運行時動態的申請和調用,所以程序的運行環境中必須存在相應的庫。因為動態函數庫并不影響你的程序,所以它的升級相對簡單。

二.生成靜態庫動態庫的有關gcc命令

  要明白linux下是如何生成靜態庫和動態庫的,首先需要了解gcc的常見命令:

  1).無選項編譯鏈接。eg:gcc test.c           //會默認生成a.out可執行程序  2).-E:進行預處理和編譯,生成匯編文件 eg:gcc -E test.c    //會生成test.i文件  3).-S:進行預處理,編譯,匯編等步驟 eg:gcc -S test.c      //生成test.s文件  4).-c:直接生成二進制目標文件,eg:gcc -c test.c           //生成test.o文件

  5).-o:對生成的目標進行重命名,eg:gcc -o test test.c 或者是 gcc test.c -o test  //生成test的可執行文件,這個可執行文件緊挨著參數'-o'

  6).-g:在編譯的時候用于debug調試信息,用于gdb調試  7).-share:此選項盡量的使用動態庫,所以生成文件比較小,但是必須是系統存在動態庫。  8).-shared:生成共享目標文件,通常用在建立共享庫。  9).-static:鏈接時使用靜態鏈接,但是要保證系統中有靜態庫。

 10).-llibrary:定制編譯的時候使用的庫 ,eg:gcc -lpthread test.c //在編譯的時候要依賴pthread這個庫 11).-Ldir:定制編譯的時候搜索庫的路徑。如果是自己編寫的庫,可以用它來定制搜索目錄,否則編譯器只在標準庫目錄里面找,dir就是目錄的名字。

 12).-C:在預處理的時候不刪除注釋信息,一般和-E使用。

 13).-pipe:使用管道代替編譯中的臨時文件,eg:gcc -pipe -o test test.c 14).-include file:包含某個代碼,相當于在文件中加入#include,eg:gcc test -include /root/file.h 15).-Idir:當你使用#include”file”的時候,會先到你定制的目錄里面查找 16).-I-:取消前一個參數的功能。一般在-Idir之后使用

三.如何生成靜態庫和動態庫

1.生成靜態庫

 靜態庫的操作工具 gcc和ar命令,它的產生分兩步:

 1).由源文件編譯生成一堆".o"文件,每個.o文件中都包含這個編譯單元的符號表

 2).ar命令將很多.o文件生成.a文件,生成靜態庫,eg:ar cr xxx.a xxx.o將創建靜態庫

詳細操作如下:

(1)把代碼編譯為目標文件形式:

# gcc -c liberr.c -o liberr.o

(2)使用工具ar創建一個存檔文件:

# ar rcs liberr.a liberr.o

(3)編譯程序時把程序和liberr.a鏈接起來:

# gcc errtest.c -o errtest -static -L./ -lerr

2.生成動態庫

 無論是靜態庫和動態庫都是由一大堆.o文件生成的,在上述gcc命令的簡介中我們知道利用-shared可以創建動態庫。eg;gcc -shared -fPCI -o xxx.so xxx.o.

 "PCI"命令行標記告訴GCC產生的代碼不要包含對函數和變量具體內存位置的引用,這是因為現在還無法知道使用該消息代碼的應用程序會將它連接到哪一段內存地址空間。這樣編譯出的xxx.o可以被用于建立共享鏈接庫。

 

實現動態庫的方法:

(1)首先編譯目標文件:

# gcc -fPIC -g -c liberr.c -o liberr.o

(2)然后鏈接庫:

#gcc -g -shared -Wl,-soname,liberr.so -o liberr.so.1.0.0 liberr.o -lc

(3)把生成的動態庫liberr.so.1.0.0拷貝到/usr/lib目錄里:

#cp liberr.so.1.0.0 /usr/lib

(4)進入/usr/lib目錄建立兩個鏈接文件:

#cd /usr/lib

#ln -s liberr.so.1.0.0 liberr.so.1

#ln -s liberr.so.1.0.0 liberr.so

(5)編譯程序時和動態庫鏈接起來:

#gcc errtest.c -o errtest -lerr

如何查看一個可執行程序依賴于哪些庫?

ldd+文件名,可以查看一個可執行程序依賴的共享庫

 
上一篇:SSM_02_攔截器

下一篇:二叉樹

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 万全县| 阜南县| 泽库县| 丹寨县| 马关县| 灵丘县| 乌恰县| 黄龙县| 闽侯县| 甘泉县| 三门县| 普安县| 定州市| 阜新| 汝城县| 交城县| 图片| 桓仁| 新丰县| 利川市| 绍兴县| 德化县| 逊克县| 东光县| 高安市| 平遥县| 霍山县| 商水县| 南和县| 呼玛县| 连城县| 札达县| 延安市| 本溪| 施甸县| 灵川县| 鲜城| 河西区| 左权县| 法库县| 兴安盟|