Linux下動態鏈結庫和靜態鏈結庫

2022-07-18 06:12:12 字數 2324 閱讀 1030

第一部分:編譯過程

預處理過程,負責標頭檔案展開,巨集替換,條件編譯的選擇,刪除注釋等工作。gcc –e表示進行預處理。

編譯過程,負載將預處理生成的檔案,經過詞法分析,語法分析,語義分析及優化後生成彙編檔案。gcc –s表示進行編譯。

彙編,是將彙編**轉換為機器可執行指令的過程。通過使用gcc –c或者as命令完成。

鏈結,負載根據目標檔案及所需的庫檔案產生最終的可執行檔案。鏈結主要解決了模組間的相互引用的問題,分為位址和空間分配,符號解析和重定位幾個步驟。實 際上在編譯階段生成目標檔案時,會暫時擱置那些外部引用,而這些外部引用就是在鏈結時進行確定的。鏈結器在鏈結時,會根據符號名稱去相應模組中尋找對應符 號。待符號確定之後,鏈結器會重寫之前那些未確定的符號的位址,這個過程就是重定位。

鏈結庫的隱式呼叫,一方面可以採用-l 引數指定鏈結庫位址,或者在環境變數中將鏈結庫的位址加入,或者將鏈結庫加入到內定的目錄中(/usr/lib/,/lib/等),具體方法如下面幾部分,保證執行過程中,可以找到鏈結庫的位址。

gcc -o test a.o c.so

gcc -o test a.o -l /usr/local/mm/c.so

1. ld會去找gcc命令中的引數-l

2. 再找gcc的環境變數library_path

3. 再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程式內的

1. 編譯目標**時指定的動態庫搜尋路徑 (-l 引數)

2. 環境變數ld_library_path指定的動態庫搜尋路徑

例如動態庫libhello.so在/home/ting/lib目錄下,以bash為例,使用命令:$export ld_library_path=$ld_library_path:/home/ting/lib

3. 配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑

修改/etc/ld.so.conf檔案,把庫所在的路徑加到檔案末尾,並執行ldconfig重新整理。這樣,加入的目錄下的所有庫檔案都可見

4. 預設的動態庫搜尋路徑/lib

5. 預設的動態庫搜尋路徑/usr/lib

所以可以把庫拷貝到/usr/lib和/lib目錄下。

#include ...

#include

//顯式載入需要用到的標頭檔案

intmain()

void (*print)() = dlsym(pdlhandle, "

print

"); //

定位動態鏈結庫中的函式

if( !print )

print();

//呼叫動態鏈結庫中的函式

dlclose(pdlhandle);

//系統動態鏈結庫引用數減1

return0;

}

第六部分:linux下標頭檔案查詢

#include <> : 直接到系統指定的某些目錄中去找某些標頭檔案。

#include 「」 : 先到原始檔所在資料夾去找,然後再到系統指定的某些目錄中去找某些標頭檔案。

gcc尋找標頭檔案的路徑:

1. 在gcc編譯原始檔的時候,通過引數-i指定標頭檔案的搜尋路徑,如果指定路徑有多個路徑時,則按照指定路徑的順序搜尋標頭檔案。命令形式如:「gcc -i /path/where /theheadfile/in sourcefile.c「,這裡原始檔的路徑可以是絕對路徑,也可以是相對路徑。比如設當前路徑為/root/test,include_test.c如果要包含標頭檔案「include/include_test.h「,有兩種方法:

1)include_test.c中#include 「include/include_test.h」或者#include "/root/test/include/include_test.h",然後gcc include_test.c即可

2)include_test.c中#include 或者#include ,然後gcc –i include include_test.c也可

2.通過查詢gcc的環境變數來搜尋標頭檔案位置,分別是:

cpath/c_include_path/cplus_include_path/objc_include_path。

3. 再在預設目錄下搜尋,分別是:

/usr/include

/usr/local/include

/usr/lib/gcc-lib/i386-linux/2.95.2/include

參考文獻:

linux gcc常用命令 [

linux 編譯,鏈結和載入  [

linux動態鏈結庫的隱式載入和顯示載入 [

動態鏈結庫和靜態鏈結庫

函式和資料被編譯進乙個二進位制檔案 通常擴充套件名為.lib 在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案 exe檔案 在使用動態鏈結庫的時候,往往提供兩個檔案 乙個引入庫和乙個dll。引入庫包含被dll匯出的函...

linux中的動態鏈結庫和靜態鏈結庫

什麼是庫?庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib...

動態鏈結庫和靜態鏈結庫的區別

平時總聽人講動態鏈結庫 靜態鏈結庫 lib dll so等名詞,一直搞不清楚這幾者之間的區別以及各自的應用場合。後來上網仔細查了一下資料,終於搞清楚了,在這裡整理一下先。動態鏈結庫 動態鏈結庫中包含了多個已經被編譯 鏈結好的函式和資料資源,但並不包含函式的原始碼。動態鏈結庫在windows下是.dl...