所有的編譯系統都提供一種機制,將所有相關的目標模組打包成為乙個單獨的檔案,成為靜態庫它可以用作鏈結器的輸入。當鏈結器構造乙個輸出的可執行檔案時,它只複製靜態庫里被應用程式引用的目標模組。
這裡我們要用到三個簡單的c語言程式addvec.c、multvec.c和main2.c。
int addcnt=0;
void addvec(int *x,int *y,int *z,int z);
int y[2]=;
int z[2];
int main()main2.c
生成靜態庫
首先需得到兩個程式的可充定位目標檔案,開啟終端,輸入如下指令:
要建立這兩個函式的乙個靜態庫,需要使用ar工具
輸入指令如下:
呼叫靜態庫庫
此時需要另外乙個程式main2.c,起到呼叫以上兩個函式的作用,即起到呼叫我們建立的函式庫的作用。
首先輸入如下指令,得到main2.c對應的main2.o檔案
接著輸入如下指令進行呼叫
mian.o檔案中函式通過呼叫此前生成的libvector.a靜態庫中內容,最後生成乙個名為prog2c的完全鏈結的可執行目標檔案,整個鏈結過程到此就結束了。
靜態鏈結庫的完整結構示意圖如下:
靜態庫鏈結
在一般的情況下,一種語言的開發環境往往會附帶有語言庫 language library 這些庫就是對作業系統的api的包裝。其實乙個靜態庫可以簡單地看成一組目標檔案的集合,即很多目標檔案經過壓縮打包後形成的乙個檔案。我們知道在乙個c語言的執行庫中,包含了很多跟系統功能相關的 比如輸入輸出 檔案操作 ...
靜態庫,靜態鏈結,動態鏈結 的區別
遺憾地說 除了ender說的 靜態庫在程式執行時就會裝入記憶體,而動態庫在呼叫的時候才裝入!是正確的外,其他觀點都有偏頗之處甚至是錯誤的。我的感覺是,大家受mfc的影響太深了,而沒有看到事情的本質。首先糾正所謂 靜態連線就是把需要的庫函式放進你的exe之中 的說法。在真實世界中,有三個概念 use ...
鏈結 靜態庫 共享庫
編譯器生成可重定位目標檔案 o 鏈結器,將不同的可重定位檔案,進行符號解析,重定位等操作。鏈結到一起。生成最終的可執行檔案。編譯器生成的目標檔案,從位址0開始。重定位操作,將不同的模組中的位址,與最終記憶體位址對應。將庫檔案拷貝,嵌入可執行檔案中。鏈結發生在編譯期間,程式執行之前。生成的最終程式中,...