linux庫引入之動態庫靜態庫(生成和使用)

2021-10-25 10:07:08 字數 3485 閱讀 8697

庫:

庫是一種可執行**的二進位制形式,可以被作業系統載入記憶體執行。就是將源**轉化為二進位制格式的源**,相當於進行了加密,別人可以使用庫,但是看不到庫中的內容。

如何使用

使用者需要同時具有標頭檔案和庫。

標頭檔案(相當於說明書的作用,能夠知道這個庫能幹嘛)

製作出來的庫(具體的實現,存放.c、.cpp)

靜態庫:靜態庫的製作和使用

(1)命名規則

靜態庫檔名的命名方式是「lib***.a」,庫名前加」lib」,字尾用」.a」,「***」為靜態庫名。

(2)製作步驟

原材料:源**.c 或者 .cpp

1、將.c檔案生成.o,gcc a.c b.c -c

pi@raspberrypi:~/test$ ls

togetherfunc1.c togetherfunc1.h togetherfunc.c

pi@raspberrypi:~/test$ gcc togetherfunc1.c -c

pi@raspberrypi:~/test$ ls

togetherfunc1.c togetherfunc1.h togetherfunc1.o togetherfunc.c

2、將.o 打包

ar rcs 靜態庫的名字 原材料

ar rcs libtest.a a.o b.o

pi@raspberrypi:~/test$   ar

//輸入指令ar,檢視各個引數的功能

ps:以下是一些指令的介紹

mv togetherfunc1.c ~

//~表示工作目錄 將這個.c檔案移到工作目錄

cp ~/togetherfunc1.c .

//從工作目錄再移到當前檔案

mv togetherfunc1.* ~

//將當前資料夾下的以togetherfunc1開頭的檔案移動到工作目錄下。 * 是萬用字元

**演示

pi@raspberrypi:~/test$ ls

togetherfunc1.c togetherfunc1.h togetherfunc1.o togetherfunc.c

pi@raspberrypi:~/test$ ar rcs libfunc1.a togetherfunc1.o

pi@raspberrypi:~/test$ ls

libfunc1.a togetherfunc1.c togetherfunc1.h togetherfunc1.o togetherfunc.c

(3)庫的使用

若直接-l 編譯會報錯,因為-l 會優先從/urs/lib 或 /urs/local/lib 中去找,但我們想讓它優先從當前路徑去找,就要用到-l。

pi@raspberrypi:~/test$ gcc togetherfunc.c -lfunc1

/usr/bin/ld: cannot find -lfunc1

collect2: error: ld returned 1 exit status

應該這樣使用:

gcc togetherfunc.c -lfunc1 -l ./ -o mainprostatic

//-l 是指定要用的動態庫名稱,庫名砍頭去尾去掉lib和.a

//-l 告訴gcc編譯器從-l指定的路徑去找靜態庫。預設先是從/urs/lib 或 /urs/local/lib 中去找,若-l後先從指定的路徑去找,找不到再從/urs/lib 或 /urs/local/lib 中去找。

// ./表示當前路徑

// -o後是編譯後程式的名字

動態庫的生成和使用(1)命名規則

動態庫的命名方式與靜態庫類似,字首相同,為「lib」,字尾變為「.so」。所以為「libmytime.so」

(2)製作步驟

輸入指令:

gcc -shared a.o b.o -o lib***.so
**演示:

pi@raspberrypi:~/test $ ls

libfunc1.a togetherfunc1.c togetherfunc1.h

pi@raspberrypi:~/test $ gcc -shared -fpic togetherfunc1.c -o libfun1.so

pi@raspberrypi:~/test $ ls

libfun1.so libfunc1.a togetherfunc1.c togetherfunc1.h

//-shared 的意思是指定生成動態庫

// -fpic 標準,fpic選項作用於編譯階段,在生成目標檔案時就得使用該選項,以生成位置無關的**。

(3)動態庫的使用

動態庫優先從當前路徑去找,沒找到的話再去/usr/lib/下去找

sudo cp libfun2.so /usr/lib/

//將生成的動態庫拷貝到/usr/lib

sudo rm /usr/lib/libfun2.so

//從/usr/lib/中移除剛才移入的動態庫

gcc togetherfunc.c -l fun2 -l ./ -o mianprody

//這是編譯的時候

//執行的時候可能此時會提示no such file or directory,需要進行環境變數的設定

動態庫無法載入(引用動態庫,怎麼指定動態庫的位置):

臨時設定:

在終端進行:

export ld_library_path=「動態庫的路徑」

利用指令碼:

vi start.sh

//建立乙個.s**件

export ld_library_path="/home/pi/test//動態庫的路徑"

./mianprody//所要執行的程式名稱

//在資料夾中輸入以上內容

chmod +x start.sh

//給指令碼加可執行的的許可權

./start.sh

//執行該指令碼

計算檔案大小

pi@raspberrypi:~/test $ du libfunc1.a

4 libfunc1.a

pi@raspberrypi:~/test $ du mianprody

12 mianprody

linux庫引入之動態庫靜態庫(生成和使用)

庫 庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。就是將源 轉化為二進位制格式的源 相當於進行了加密,別人可以使用庫,但是看不到庫中的內容。如何使用 使用者需要同時具有標頭檔案和庫。標頭檔案 相當於說明書的作用,能夠知道這個庫能幹嘛 製作出來的庫 具體的實現,存放.c cpp 靜態庫...

linux 靜態庫 動態庫

1.概念和區別 靜態庫就是在編譯過程中一些目標檔案的集合。靜態庫在程式鏈結的時候使用,鏈結器會將程式中使用到函式的 從庫檔案中拷貝到應用程式中。一旦鏈結完成,在執行程式的時候就不需要靜態庫了。由於每個使用靜態庫的應用程式都需要拷貝所用函式的 所以靜態鏈結的檔案會比較大。相對於靜態函式庫,動態函式庫在...

linux 靜態庫 動態庫

linux支援兩種庫的型別 靜態庫和動態庫 共享庫 1.linux靜態庫和動態庫的命名規則 靜態函式庫 lib a 動態函式庫 lib so 這些庫檔案都是由 o檔案生成的 動態庫 程式執行過程中進行連線。可執行檔案 庫檔案 靜態庫 編譯時進行連線。庫檔案 的複製貼上過程。程式執行時先檢查依賴的庫檔...