庫:
庫是一種可執行**的二進位制形式,可以被作業系統載入記憶體執行。就是將源**轉化為二進位制格式的源**,相當於進行了加密,別人可以使用庫,但是看不到庫中的內容。
如何使用
使用者需要同時具有標頭檔案和庫。
標頭檔案(相當於說明書的作用,能夠知道這個庫能幹嘛)
製作出來的庫(具體的實現,存放.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檔案生成的 動態庫 程式執行過程中進行連線。可執行檔案 庫檔案 靜態庫 編譯時進行連線。庫檔案 的複製貼上過程。程式執行時先檢查依賴的庫檔...