靜態鏈結庫和動態鏈結庫

2021-09-27 22:03:52 字數 1878 閱讀 6426

源**編寫

#include

void

func1

(void

)int

func2

(int a,

int b)

標頭檔案編寫

void

func1

(void);

intfunc2

(int a,

int b)

;

使用命令進行編譯、打包

gcc demo.c -o demo.o -c

ar -rc libdemo.a demo.o

**使用gcc -c 只編譯生成機器碼檔案(.o檔案),不進行鏈結。然後使用ar工具打包成.a歸檔檔案。庫名一般是lib+庫名稱。**至此,生成 .a和.**件,可以進行發布(相當於把.c檔案密封為.o檔案,函式宣告仍在.**件中)。

使用靜態鏈結庫

把.a和.h都放在需要引用的資料夾下,然後再編寫了.c檔案中包含庫的.h,然後直接使用庫函式。

注意:直接編譯(gcc test.c -o test)會報錯,因為鏈結器只會在預設鏈結庫中查詢,對於自定義的鏈結庫需要制定具體的鏈結庫檔案和目錄(gcc test.c -o test -ldemo -l.)

-l*** ------- 指明需要的鏈結庫檔案lib***.a。

-l. --------- 指定鏈結器需要在那個目錄下需要庫檔案。句點 . 表示當前目錄

nm lib***x.a ------- 檢視乙個.a檔案中都有哪些符號源**編寫

#include

void

func1

(void

)int

func2

(int a,

int b)

標頭檔案編寫

void

func1

(void);

intfunc2

(int a,

int b)

;

使用命令進行編譯、打包

gcc demo.c -o demo.o -c -fpic

gcc -o libdemo.so demo.o -shared

-fpic ----- 是位置無關碼

-share ----- 是按照共享庫的方式來鏈結

至此生成lib***.so和***.h,可以進行發布。

使用動態鏈結庫

把.a和.h都放在需要引用的資料夾下,然後再編寫了.c檔案中包含庫的.h,然後直接使用庫函式。

編譯方式:gcc test.c -o test -ldemo -l.

編譯成功,但執行出錯。這是因為動態鏈結庫在執行時需要被載入,但是系統會去**固定目錄(/user/lib)**嘗試載入所需要的動態庫檔案。

解決辦法一:將庫檔案放到固定目錄(/user/lib)下。cp lib***.so /user/lib

解決辦法二:使用環境變數ld_library_path。作業系統在載入固定目錄/user/lib之前,會先去ld_library_path這個環境變數所指定的目錄去尋找,如果找到就不用去固定目錄/user/lib下找了,如果沒找到再去/user/lib下面找。所以解決辦法就是將lib***.so所在的目錄新增到環境變數ld_library_path中去。 例如 在linux 命令列中輸入 export ld_library_path = $ld_library_path:/mnt/hgfs/myshare

ldd test ----- 解析處test程式使用了哪些共享庫,並且檢視這些共享庫是否被載入並被解析(決定這個程式是否能正確執行)。

靜態鏈結庫和動態鏈結庫

其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...

靜態鏈結庫和動態鏈結庫

靜態鏈結庫 win32 static library 呼叫libtest.lib 動態dll win32 dynamic link library 跟librest的生成是一樣的 動態呼叫 成的.lib 和.dll 檔案拷入dllcall 工程所在的路徑,dllcall 執行下列 dll 中匯出函式...

靜態鏈結庫和動態鏈結庫

以前的時候寫過這方面的部落格,當時寫的時候都覺得已經懂了。今天閒著沒事幹,和咚哥他們去大華校招筆試遇到了這個問題。我突然間發現sdk沒寫三個月,把dll都忘記了。回來看了下,複習下。以前寫過程式的裝載和鏈結的部落格,那是os上面比較理論的。實際用函式庫的時候主要分為,靜態庫和動態庫,這裡就簡簡單單地...