Linux 靜態庫和動態庫的製作和使用

2021-08-28 08:56:37 字數 1972 閱讀 6580

一、linux作業系統支援的函式庫分支

靜態庫:lib***.a,在編譯時就將庫編譯進可執行程式

優點:程式的執行環境中不需要外部的函式庫

缺點:可執行程式大

動態庫:又稱共享庫,lib***.so,在程式執行時將庫載入到可執行程式中

優點:可執行程式小

缺點:程式的執行環境中必須提供相應的庫

函式庫目錄:/lib  /usr/lib

二、靜態庫的製作

① 生成目標檔案:gcc  -c  file.c

② 靜態庫的建立命令 ar

ar  -cr  libfile.a  file.o

-c:crete的意思

-r:replace的意思,表示當插入的模組file.o已經存在libfile.a中,則覆蓋。反之ar顯示乙個錯誤資訊。  

③ 操作靜態庫的幾個例項:

情況1:如果從別處得到乙個靜態庫libunknown.a,想知道其中包含哪些模組。

命令--- ar  -t  libunknown.a

靜態庫的編譯:gcc  -o  main  main.c  -l.  -lfile 編譯main.c 就會把靜態庫整合到main中。

其中:  

-l:指定靜態函式庫的位置供查詢,注意l後面還有個. ,表示靜態庫在當前目錄查詢。

-l:則指定了靜態庫名,由於靜態函式庫的命名方式是lib***.a,其中lib和 .a可以忽略不寫。

④ 示例

三、動態庫的製作

① 生成目標檔案:gcc  -c  file.c

② gcc  -shared  -fpic  -o  libfile.so  file.o

-fpic:產生位置無關**

-shared:生成共享庫

用上述命令生成libfile.so動態函式庫。

gcc  -o  out  main.c  -l.  -lfile

此時還不能立即執行./out ,因為在動態函式庫使用時,會預設在 /usr/lib或 /lib目錄下去查詢動態庫,而此時我們生成的庫不在裡面

③ 示例

第一種方法:

libfile.so方到 /lib 或 /usr/lib中去

第二中方法: 環境變數的方法,假設libsub.so在~/coding/libsotest

執行 export ld_library_path=~/coding/libsotest

echo $ld_library_path 檢視路徑是否新增成功

第三種方法:修改sheel配置指令碼

在/etc/ld.so.conf檔案裡加入我們生成的庫目錄,然後/sbin/ldconfig

/etc/ld.so.conf是乙個非常重要的目錄,裡面存放的是鏈結器和載入器搜尋共享庫時要檢查的目錄,預設是從/usr/lib

或/lib 中讀取,所以想要順利執行,可以把我們庫的目錄加入到這個檔案中並執行/sbin/ldconfig

① 開啟ld.so.conf檔案    

② 向檔案中新增路徑

③ 用ldconfig執行sheel指令碼

④ 執行可執行程式

四、靜態庫和動態庫的大小比較

由此可見:

編譯成功後可執行程式,靜態庫比較大,因為這裡**不多,所以看不到有很大差距

Linux靜態庫和動態庫的製作

1.什麼是庫檔案?儲存函式和變數 特點 儲存的函式與變數只能使用但不能看到其實現 2.linux庫檔案 靜態庫 在編譯階段載入 將庫檔案的 載入到原始檔 動態庫 在執行時載入 3.生成可執行檔案存在的區別 優缺點 1 使用靜態庫生成的可執行檔案大於動態庫生成的可執行檔案 程式占用的記憶體較多 2 使...

Linux下製作靜態庫和動態庫

所謂庫檔案,就是一堆函式的集合。一堆函式原始碼的集合 c 一堆二進位制函式 的集合 so 使用者可以呼叫庫裡面的函式,但是沒有辦法看到函式的實現過程。在linux裡面,庫有兩種,一種是靜態庫 lib x.a 另外一種是動態庫 共享庫 lib x.so 例子 libabc.so.0.8 lib 庫的字...

製作靜態庫和動態庫

製作靜態庫的方法 1 把 編譯為目標檔案形式 gcc c liberr.c o liberr.o 2 使用工具ar建立乙個存檔檔案 ar rcs liberr.a liberr.o gcc errtest.c o errtest static l.lerr 製作動態庫的方法 1 首先編譯目標檔案 g...