建立靜態鏈結庫 動態鏈結庫

2021-10-24 08:05:55 字數 3346 閱讀 7257

(下面的實操中的動態庫或者靜態庫名都用wujunwu)

第一步;建立乙個源**

/* 

建立靜態鏈結庫的源**

*/#include

void

func1

(void

)int

func2

(int x,

int y)

第二步:建立乙個.**件作為函式宣告

void

func1

(void);

intfunc2

(int x,

int y)

;

第三步:建立乙個makefile檔案編譯

all:

gcc wujunwu.c -o wujunwu.o -c

ar -rc libwujunwu.a wujunwu.o

其中,gcc wujunwu.c -o wujunwu.o -c //只編譯不鏈結

ar:歸檔器指令工具

libwujunwu.a:必須是lib開頭+鏈結庫名;其中.a字尾名是歸檔檔案

第四步:linux中編譯輸入make生成wujunwu.o和wujunwu.a檔案

編譯結果:

gcc wujunwu.c -o wujunwu.o -c     

ar -rc libwujunwu.a wujunwu.o

下面是使用靜態鏈結庫
#include

"wujunwu.h"

//鏈結到當前目錄

#include

//鏈結到系統指定的目錄下

intmain

(void

)

第六步:在linux中輸入:gcc test.c -o test -lwunjunwu -l.。最後./test執行。

其中:-l+庫名——指明編譯時鏈結到靜態鏈結庫

-l.——l後面有乙個點。指明了鏈結庫的位址是當前目錄下

注意:必須將wujunwu.a和wujunwu.h和test.c這幾個檔案放在同乙個目錄下。

root@ubuntu:

/mnt/hgfs/winshare/staticlib/test# gcc test.c -o test -lwujunwu -l.

root@ubuntu:

/mnt/hgfs/winshare/staticlib/test# ls

libwujunwu.a test test.c wujunwu.h

root@ubuntu:

/mnt/hgfs/winshare/staticlib/test# .

/test

wujunwu:

wujunwu:

a=11

靜態鏈結庫的字尾名是.a(相對應的windows系統中是.dll檔案),但是動態鏈結庫的字尾名是.so

all:

gcc wujunwu.c -o wujunwu.o -c -fpic

gcc -o libwujunwu.so wujunwu.o -shared

其中,-fpic是位置無關碼

-shared是按照共享庫的方式連線

第四步:make

結果:

gcc wujunwu.c -o wujunwu.o -c -fpic    

gcc -o libwujunwu.so wujunwu.o -shared

下面是使用動態鏈結庫
#include

"wujunwu.h"

//鏈結到當前目錄

#include

//鏈結到系統指定的目錄下

intmain

(void

)

第六步:在linux中輸入:gcc test.c -o test -lwunjunwu -l.。

其中:-l+庫名——指明編譯時鏈結到靜態鏈結庫

-l.——l後面有乙個點。指明了鏈結庫的位址是當前目錄下

編譯結果:

root@ubuntu:

/mnt/hgfs/winshare/dll/test# gcc test.c -o test -lwujunwu -l.

root@ubuntu:

/mnt/hgfs/winshare/dll/test# ls

libwujunwu.so test test.c wujunwu.h

第七步:輸入 ./test執行

結果:

.

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

解決方法:

方法一:將libwujunwu.so檔案放到固定目錄下,這個固定目錄一般是 /usr/lib

方法二:使用環境變數ld_library_path。

作業系統在載入固定目錄/urs/lib之前,會先去ld_library_path這個環境變數所指定的目錄下尋找,如果找到了就不去/urs/lib下找了,如果沒找到再去/urs/lib下bra

rypa

th中即

可。ex

port

ldli

brar

ypat

h=

brary_path中即可。 export ld_library_path=

braryp

​ath

中即可。

expo

rtld

l​ib

rary

p​at

h=ld_library_path:/mnt/hgfs/winshare/dll/test

執行結果:

root@ubuntu:

/mnt/hgfs/winshare/dll/test# *

*export export ld_library_path=$ld_library_path:

/mnt/hgfs/winshare/dll/test*

*root@ubuntu:

/mnt/hgfs/winshare/dll/test# .

/test

wujunwu:

wujunwu:

a=11

root@ubuntu:

/mnt/hgfs/winshare/dll/test#

方法三:在ubuntu中還可以使用ldconfig

動態鏈結庫 靜態鏈結庫

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

靜態鏈結庫 動態鏈結庫

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

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...