靜態庫 動態庫

2021-10-08 17:46:40 字數 2276 閱讀 7833

學習程式設計,要對編譯鏈結過程了然如胸。在鏈結階段,有兩種鏈結方式——靜態鏈結和動態鏈結。

兩者最大的區別在於鏈結的時機不一樣,靜態鏈結是在形成可執行程式前,而動態鏈結的進行則是在程式執行時,下面來詳細介紹這兩種鏈結方式。

一、靜態鏈結

​ 然後使用ar工具生成a庫,指令如下:ar命令詳細介紹可以參考這篇部落格:

ar rcs libtest.a add.o sub.o

//注意:鏈結庫字首必須以lib開頭

​ 得到libtest.a庫檔案後,然後將.a庫鏈結到主程式中,寫主程式main.c

#include

"calc.h"

#include

intmain

(int argc,

char

const

*ar**)

​ 載入a庫,生成可執行檔案並執行,指令如下:

可以看到,a庫連線成功,可以呼叫到裡面的函式。

二、動態鏈結

​ 動態鏈結可以很好地解決靜態鏈結的兩個缺點。

如何生成動態庫

利用上面所寫過的add.c 和sub.c生成.so庫的指令如下:

​ 同樣so庫的字首必須為lib,然後將.so庫鏈結到主程式main.c中,這裡需要注意一下,因為動態庫的特性,編譯器會到指定的目錄去尋找動態庫,目錄的位址在/etc/ld.so.conf.d/ 目錄裡的libc.conf檔案裡,你可以在裡面加一行位址表示你so庫的位置,更改完conf檔案裡的內容,記得輸入命令列:ldconfig。

​ 你還可以將so庫複製到預設的目錄下。這裡是將so庫複製到了預設目錄 /uer/lib/ 下,生成可執行檔案並執行,指令如下:

三、靜態鏈結庫和動態鏈結庫的區別

主程式在執行前,靜態鏈結庫的鏈結固定寫入在程式中,而動態鏈結庫則是在每次程式執行再載入鏈結。

​ 1). 在執行gcc main.c -l. -ltest -o main 前,在環境變數 ld_library_path 中指明庫的搜尋路徑。即執行 export ld_library_path=$(pwd)

​ 2). 將你so所在的目錄寫到/etc/ld.so.conf檔案裡,然後執行ldconfig。

​ 3). 將你的so放在/etc/ld.so.conf裡的路徑位置裡。

靜態庫動態庫

靜態庫動態庫 靜態庫 是在執行程式之前就已經加入到執行 中,成為執行程式的一部分來執行的,字尾名 a 動態庫 是在執行程式啟動時載入到執行 中,字尾名 so 靜態庫和動態庫區別 動態庫編譯速度慢,執行速度快,但是生成的程式體積較大,占用記憶體,然而動態庫較易公升級,就布局而言,動態庫 不易布局,執行...

靜態庫動態庫

我們使用ls l的時候看到的除了看到檔名,還看到檔案的元資料 擁有的許可權 硬鏈結數 檔案所有者 組 大小 檔案最後修改時間 檔名ls l讀取儲存在磁碟上的檔案資訊,然後顯示出來 其實這個資訊除了通過這種方式來讀取,還有乙個sata命令能夠看到更多的資訊 這裡寫描述 上面的執行結果有幾個資訊需要解釋...

靜態庫,動態庫

我想多說關於程式編譯的一些規範和方法,一般來說,無論是c c 還是pas,首先要把原始檔編譯成中間 檔案,在windows下也就是 obj 檔案,unix下是 o 檔案,即 object file,這個動作叫做編譯 compile 然後再把大量的object file合成執行檔案,這個動作叫作鏈結 ...