linux库引入之动态库静态库(生成和使用)
庫:
庫是一種可執行代碼的二進制形式,可以被操作系統載入內存執行。就是將源代碼轉化為二進制格式的源代碼,相當于進行了加密,別人可以使用庫,但是看不到庫中的內容。
如何使用
用戶需要同時具有頭文件和庫。
頭文件(相當于說明書的作用,能夠知道這個庫能干嘛)
制作出來的庫(具體的實現,存放.c、.cpp)
靜態庫:
是在程序執行前(編譯)就加入到目標程序中去了。
優點:
1、靜態庫被打包到應用程序中運行速度快
2、發布程序無需提供靜態庫,因為已在app中,移植方便
缺點:
1、鏈接時完整的拷貝至可執行文件中,被多次使用就有多份冗余的拷貝。
2、更新、部署、發布、比較麻煩。
動態庫:
是在執行程序時動態(臨時)由目標程序去調用
優點:
1、鏈接時不復制,程序運行時由系統動態加載到內存,供程序使用,系統只加載一次,多個程序可以共用,節省內存。
2、程序升級簡單,因為app里面沒有源代碼,升級之后只要庫的名字不變,函數名以及參數不變,只是實現了優化,就能加載成功。
缺點:
1、加載速度比靜態庫慢
2、發布程序需要提供依賴的動態庫
靜態庫的制作和使用
(1)命名規則
靜態庫文件名的命名方式是“libxxx.a”,庫名前加”lib”,后綴用”.a”,“xxx”為靜態庫名。
(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.c2、將.o 打包
ar rcs 靜態庫的名字 原材料
ar rcs libtest.a a.o b.o
代碼演示
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 libxxx.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 //創建一個.sh文件 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库引入之动态库静态库(生成和使用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL随机函数的运用场景示例总结
- 下一篇: cp105b linux 驱动,富士施乐