學習程式設計,要對編譯鏈結過程了然如胸。在鏈結階段,有兩種鏈結方式——靜態鏈結和動態鏈結。
兩者最大的區別在於鏈結的時機不一樣,靜態鏈結是在形成可執行程式前,而動態鏈結的進行則是在程式執行時,下面來詳細介紹這兩種鏈結方式。
一、靜態鏈結
然後使用ar工具生成a庫,指令如下:ar命令詳細介紹可以參考這篇部落格:
ar rcs libtest.a add.o sub.o
//注意:鏈結庫字首必須以lib開頭
得到libtest.a庫檔案後,然後將.a庫鏈結到主程式中,寫主程式main.c
載入a庫,生成可執行檔案並執行,指令如下:#include
"calc.h"
#include
intmain
(int argc,
char
const
*ar**)
可以看到,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合成執行檔案,這個動作叫作鏈結 ...