靜態鏈結庫,動態鏈結庫

2021-09-23 10:08:23 字數 2172 閱讀 5566

關於靜態鏈結庫,參考如下博文:

當你完成了**開發,想把這個**給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。

或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。

那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?

範例1:我們想把linuxframe.c和linuxframe.h這兩個檔案生產庫給使用者

1、靜態庫.a檔案的生成與使用。

1.1、生成目標檔案(***.o)

1.2、生成靜態庫.a檔案

1.3、使用.a庫檔案,建立可執行程式(若採用此種方式,需保證生成的.a檔案與.c檔案儲存在同一目錄下,即都在當前目錄下)

---> gcc -o test test.c libafile.a

---> ./test

2、共享庫.so檔案的生成與使用

2.1、生成目標檔案(***.o)(此處生成.o檔案必須新增"-fpic"(小模式,**少),否則在生成.so檔案時會出錯)

---> gcc -c -fpic a1.c  a2.c

2.2、生成共享庫.so檔案

---> gcc -shared *.o -o libsofile.so

2.3、使用.so庫檔案,建立可執行程式

---> gcc -o test test.c libsofile.so

---> ./test

發現出現錯誤:

./test: error while loading shared libraries: libsofile.so: cannot open shared object file: no such file or directory

執行ldd test,檢視鏈結情況

ldd test

linux-vdso.so.1 =>  (0x00007fff0fd95000)

libsofile.so => not found

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f937b5de000)

/lib64/ld-linux-x86-64.so.2 (0x0000563f7028c000)

發現確實是找不到對應的.so檔案。

這是由於linux自身系統設定的相應的設定的原因,即其只在/lib and /usr/lib下搜尋對應的.so檔案,故需將對應so檔案拷貝到對應路徑。

--->sudo cp libsofile.so /usr/lib

再次執行./test,即可成功執行。

---> ./test

同時可直接使用gcc -o test test.c -l. -lname,來使用相應庫檔案

其中,-l.:表示在當前目錄下,可自行定義路徑path,即使用-lpath即可。

-lname:name:即對應庫檔案的名字(除開lib),即若使用libafile.a,則name為afile;若要使用libsofile.so,則name為sofile)。

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

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

靜態鏈結庫和動態鏈結庫

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