在linux中庫與頭檔的連結:頭檔中有函數的申明,函式庫檔案實作函數的定義;函式庫中的每個函數都需要在頭檔中加以宣告。在寫入程式時,需要用頭檔來提供對常數的定義和對系統函數及函式庫函數呼叫的宣告;而函式庫是一組已經編譯好的函式的集合,也就是目標檔「.o」的集合,是按照可重複使用的原則編寫的,一般由一組互關聯的函數組成以執行某項常見任務。
本教學操作環境:linux7.3系統、Dell G3電腦。
在一般應用程式原始程式碼中,頭檔中有函數的申明,函式庫檔案實作函數的定義;函式庫中的每個函數都需要在頭檔中加以宣告。
在寫程式時,我們需要用頭檔來提供對常數的定義和對系統函數及函式庫函數呼叫的聲明,這些頭檔位於/usr/include
。這些頭檔都位於可以被編譯器自動搜尋到的目錄中,如X視窗系統的/usr/include/X11和GNU C 的/usr/include /c 。
在呼叫gcc時,可以使用標誌-I
來包含保存在子目錄或其它非標準位置中的頭文件,例如gcc -I/usr/openwin/ include fred.c
庫是一組已經編譯好的函數的集合,也就是目標文件.o的集合,是按照可重複使用的原則編寫的,一般由一組互關聯的函數組成以執行某項常見任務。
標準linux系統函式庫檔案一般儲存在/lib
和/usr/lib
目錄中。預設GCC的連結程式只搜尋標準C語言庫,這是一個歷史遺留問題。我們必須使庫檔名遵守特定的規範並在命令列中加以指定。
函式庫檔案總以lib開頭,然後指出這是什麼函式庫,最後的部分.a代表靜態函式庫,.so代表共用函式庫(即windows下的DLL動態連結函式庫)。
如gcc -o fred fred.c /usr/lib/libm.a
或gcc -o fred fred.c -lm
#-L
標誌為連結器增加庫的搜尋路徑,如gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11
靜態庫以.a結尾,也稱作歸檔文件,在生成可執行程序時,靜態庫文件就被鏈接進去,生成的可執行文件較大,可以脫離靜態庫文件運行。
#先建立兩個來源檔案fred.c和bill.c
gcc -c
編譯產生兩個目標檔案然後為這兩個函數編寫頭文件,進行函數聲明
然後在main函數中包含頭文件並呼叫其中一個庫函數
然後編譯main函數並將main.o和之前產生的bill.o鏈接,可以正確執行
#接下來我們產生庫文件,用ar歸檔程序建立歸檔檔案並將目標檔案加進去,它可將若干單獨的檔案歸併到一個大的檔案中。
ar crv libfoo.a bill.o fred.o
之後我們要用
指令為函式庫產生一個內容表。
然後我們將庫檔案和先前產生的program.o檔案連結起來,執行成功
靜態庫Linux與Windows的比較
當程式使用函數庫時,它本身在連結時不再包含函數程式碼,而是引用運行時可存取的共享程式碼,當編譯好的程式被裝載到記憶體中執行時,函數引用被解析並產生對共享庫的調用,如果有必要,共享庫才會載入到記憶體中。即係統可以只在記憶體中保留共享庫的一份副本供許多應用程式調用,在外存上也可只保留一份。而且共享庫的更新也可以獨立於依賴它的應用程序,應用程式不需要再重新編譯。 在linux系統中,負責裝載共用函式庫並解析客戶程式所引用的函數的程式(動態載入器)是
ld.so
gcc -shared -fpic -o libfoo.so bill.o fred .o
/etc/ld.so.conf中配置,修改這個檔案後執行命令
ldconfig來處理。
/etc/ld.so.conf的內容為
include /etc/ld.so.conf.d/*.conf,在此目錄下建立自己的動態連結庫路徑設定檔
mylib.conf
gcc -o main program.o -lfoo -L.
ldd工具可用於分析可執行檔運行所需的共用函式庫
也可以在編譯目標程式碼時指定.so函式庫的搜尋路徑,透過gcc 的參數-Wl,- rpath指定,如
gcc main.cpp -lfoo -L. -Wl,-rpath=.-Wl, 表示後面的參數將傳給link 程式ld (因為gcc 會自動呼叫ld )當指定多個動態庫搜尋路徑時,路徑之間會以冒號" : " 分隔。
Linux影片教學》
以上是在linux中庫與頭檔有什麼聯繫的詳細內容。更多資訊請關注PHP中文網其他相關文章!