日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux库引入之动态库静态库(生成和使用)

發布時間:2023/12/10 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.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 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库引入之动态库静态库(生成和使用)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。