首頁  >  文章  >  運維  >  在linux中庫與頭檔有什麼聯繫

在linux中庫與頭檔有什麼聯繫

青灯夜游
青灯夜游原創
2023-03-16 10:27:121386瀏覽

在linux中庫與頭檔的連結:頭檔中有函數的申明,函式庫檔案實作函數的定義;函式庫中的每個函數都需要在頭檔中加以宣告。在寫入程式時,需要用頭檔來提供對常數的定義和對系統函數及函式庫函數呼叫的宣告;而函式庫是一組已經編譯好的函式的集合,也就是目標檔「.o」的集合,是按照可重複使用的原則編寫的,一般由一組互關聯的函數組成以執行某項常見任務。

在linux中庫與頭檔有什麼聯繫

本教學操作環境:linux7.3系統、Dell G3電腦。

在一般應用程式原始程式碼中,頭檔中有函數的申明,函式庫檔案實作函數的定義;函式庫中的每個函數都需要在頭檔中加以宣告。

1. 頭檔

在寫程式時,我們需要用頭檔來提供對常數的定義和對系統函數及函式庫函數呼叫的聲明,這些頭檔位於/usr/include。這些頭檔都位於可以被編譯器自動搜尋到的目錄中,如X視窗系統的/usr/include/X11和GNU C 的/usr/include /c 。

在呼叫gcc時,可以使用標誌-I來包含保存在子目錄或其它非標準位置中的頭文件,例如gcc -I/usr/openwin/ include fred.c

2. 函式庫檔案

庫是一組已經編譯好的函數的集合,也就是目標文件.o的集合,是按照可重複使用的原則編寫的,一般由一組互關聯的函數組成以執行某項常見任務。

標準linux系統函式庫檔案一般儲存在/lib/usr/lib目錄中。預設GCC的連結程式只搜尋標準C語言庫,這是一個歷史遺留問題。我們必須使庫檔名遵守特定的規範並在命令列中加以指定。

函式庫檔案總以lib開頭,然後指出這是什麼函式庫,最後的部分.a代表靜態函式庫,.so代表共用函式庫(即windows下的DLL動態連結函式庫)。

gcc -o fred fred.c /usr/lib/libm.agcc -o fred fred.c -lm
#-L標誌為連結器增加庫的搜尋路徑,如gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11

#2.1 靜態庫

靜態庫以.a結尾,也稱作歸檔文件,在生成可執行程序時,靜態庫文件就被鏈接進去,生成的可執行文件較大,可以脫離靜態庫文件運行。

2.1.1 生成方法

#先建立兩個來源檔案fred.c和bill.c

在linux中庫與頭檔有什麼聯繫

在linux中庫與頭檔有什麼聯繫

在linux中庫與頭檔有什麼聯繫

在linux中庫與頭檔有什麼聯繫

在linux中庫與頭檔有什麼聯繫

#然後用

gcc -c

編譯產生兩個目標檔案

在linux中庫與頭檔有什麼聯繫

然後為這兩個函數編寫頭文件,進行函數聲明

然後在main函數中包含頭文件並呼叫其中一個庫函數在linux中庫與頭檔有什麼聯繫

然後編譯main函數並將main.o和之前產生的bill.o鏈接,可以正確執行在linux中庫與頭檔有什麼聯繫

#接下來我們產生庫文件,用ar歸檔程序建立歸檔檔案並將目標檔案加進去,它可將若干單獨的檔案歸併到一個大的檔案中。 ar crv libfoo.a bill.o fred.o 之後我們要用

ranlib

指令為函式庫產生一個內容表。 在linux中庫與頭檔有什麼聯繫

然後我們將庫檔案和先前產生的program.o檔案連結起來,執行成功

######也可以用###-l###指定函數庫,並用###-L###指定非標準位置。 ##################我們可以用###nm###指令查看哪些函數被包含在目標文件,函數庫或可執行檔中###,可用於反彙編分析。程式被建立時它只包含函數庫中它所實際需要的函數,雖然頭檔中有所有函數的聲明,但連結器並不會將它們全部連結進去。 ###

在linux中庫與頭檔有什麼聯繫

1在linux中庫與頭檔有什麼聯繫

靜態庫Linux與Windows的比較

1在linux中庫與頭檔有什麼聯繫

##2.2 共享庫

當同時運行許多應用程式並且他們中都使用來自同一個函數庫的函數時,記憶體中會有同一個函數的許多副本,浪費內存和外存! !

當程式使用函數庫時,它本身在連結時不再包含函數程式碼,而是引用運行時可存取的共享程式碼,當編譯好的程式被裝載到記憶體中執行時,函數引用被解析並產生對共享庫的調用,如果有必要,共享庫才會載入到記憶體中。即係統可以只在記憶體中保留共享庫的一份副本供許多應用程式調用,在外存上也可只保留一份。而且共享庫的更新也可以獨立於依賴它的應用程序,應用程式不需要再重新編譯。 在linux系統中,負責裝載共用函式庫並解析客戶程式所引用的函數的程式(動態載入器)是
ld.so

2.2.1 生成方法

用中間檔案bill.o fred.o產生共享庫libfoo.so

gcc -shared -fpic -o libfoo.so bill.o fred .o

1在linux中庫與頭檔有什麼聯繫

產生了共用程式庫後,要置於標準搜尋目錄下。搜尋共享庫的額外位置可以在檔案

/etc/ld.so.conf中配置,修改這個檔案後執行命令ldconfig來處理。
/etc/ld.so.conf的內容為include /etc/ld.so.conf.d/*.conf,在此目錄下建立自己的動態連結庫路徑設定檔mylib.conf

1在linux中庫與頭檔有什麼聯繫

#然後指定搜尋路徑

1在linux中庫與頭檔有什麼聯繫

連結產生可執行檔

gcc -o main program.o -lfoo -L.

1在linux中庫與頭檔有什麼聯繫

ldd工具可用於分析可執行檔運行所需的共用函式庫

1在linux中庫與頭檔有什麼聯繫

也可以在編譯目標程式碼時指定.so函式庫的搜尋路徑,透過gcc 的參數

-Wl,- rpath指定,如gcc main.cpp -lfoo -L. -Wl,-rpath=.-Wl, 表示後面的參數將傳給link 程式ld (因為gcc 會自動呼叫ld )當指定多個動態庫搜尋路徑時,路徑之間會以冒號" : " 分隔。

1在linux中庫與頭檔有什麼聯繫

相關推薦:《

Linux影片教學

以上是在linux中庫與頭檔有什麼聯繫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn