在具體工作中,每個軟體專案都有很多個.c原始檔,每個.c原始檔經過編譯後生成.o格式的目標檔案,那麼這些.o檔案如何生成最終的可執行程式呢?
這裡就要引入c語言的鏈結器了。
鏈結器的主要作用就是處理各個模組(目標檔案和庫檔案)之間的相互引用,使得各個模組之間能夠正確的銜接。
由鏈結器在鏈結時將庫的內容直接加入到可執行程式中(庫中,只有被使用的函式才會被鏈結進去,未使用的不會被鏈結到可執行程式中!)。
linux下靜態庫的建立和使用:
1【slib.c靜態庫檔案】char*name()25
67int add(int a, intb)8
可執行程式在執行時才動態載入庫進行鏈結,庫的內容不會進入可執行程式當中。
linux下動態庫的建立和使用:
— dlopen:開啟動態庫檔案
— dlsym:查詢動態庫中的函式並返**用位址
— dlclose:關閉動態庫檔案
1【dlib.c動態庫檔案】char*name()25
6int add(int a, intb)7
1 #include 2 #include 34int
main()522
23 dlclose(pdlib); //
關閉動態鏈結庫24}
為什麼需要動態鏈結庫呢?
方便程式的更新,當程式有bug或者程式功能需要更新時,不用更新應用程式,只需要更新動態庫檔案即可,非常方便;如果是靜態鏈結的話無法更新部分應用程式,需要全部重新編譯!
C語言高階剖析 20 鏈結過程簡介
鏈結器的意義linux 下靜態庫的建立和使用 test.c include extern char name extern int add int a,int b int main slib.c char name intadd int a,int b gcc c slib.c o slib.o a...
C語言編譯和鏈結過程簡介
一 編譯過程簡介 編譯過程可以分為4部分內容組成 預處理器 編譯器 彙編器 鏈結器 1 預處理器 1 處理所有的注釋,以空格代替 2 講所有的 define刪除,並且展開所有的巨集定義 3 處理條件編譯指令 if,ifdef elif,else endif 4 處理 include,展開檔案包含 5...
編譯鏈結過程
在談編譯鏈結過程之前我們需要了解一下虛擬位址空間以及程式在編譯鏈結過程時經過了什麼步驟。虛擬位址空間之前在程序空間的部落格中詳細介紹過了,詳見 上圖就是32位系統中4g虛擬位址空間的分布情況 text 段 指令段,存放的是指令 在程式中,我們把區域性變數定義 區域性變數的 定義是指令而不是資料 還有...