當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的制作
一、什么叫做庫(kù):
庫(kù):二進(jìn)制的程序,能被操作系統(tǒng)載入內(nèi)存中執(zhí)行
二、Linux下的庫(kù)有兩種:靜態(tài)庫(kù)和共享庫(kù)(動(dòng)態(tài)庫(kù)),二者的不同點(diǎn)在于代碼載入的時(shí)刻不同。
A、靜態(tài)庫(kù)在程序編譯的時(shí)候并會(huì)被連接到目標(biāo)代碼中,程序運(yùn)行時(shí)將不再需要該靜態(tài)庫(kù),因此體積較大
B、動(dòng)態(tài)庫(kù)在程序編譯的時(shí)候并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行時(shí)被載入,因此程序運(yùn)行時(shí)還需要?jiǎng)討B(tài)庫(kù)存在,因此目標(biāo)代碼體積小。
1、靜態(tài)庫(kù)的制作
A、創(chuàng)建靜態(tài)庫(kù)的源代碼 fun.c
B、將源代碼編譯成.o文件
gcc -c fun.c -o fun.o
gcc -c -o fun.o fun.c
C、將.o文件生成靜態(tài)庫(kù)
ar crs libfun.a fun.o(ar是生成靜態(tài)庫(kù)的命令,crs是選項(xiàng))
ar crs的諧音是愛(ài)人才認(rèn)識(shí)
靜態(tài)庫(kù)的命名規(guī)則:libxxx.a xxx表示庫(kù)名
D、編寫(xiě)測(cè)試代碼并編譯(-L 指定路徑 –lfun指定庫(kù))
gcc main.c -o main -lfun -L. 庫(kù)在當(dāng)前目錄
gcc -o main main.c -L. –lfun 一樣的效果
gcc main.c -o main -lfun -L.. 庫(kù)在上一級(jí)目錄
gcc main.c -o main -lfun -L ../auto_lib/ 庫(kù)在上一級(jí)目錄的auto_lib路徑下面
E、執(zhí)行 ./main
2、動(dòng)態(tài)庫(kù)的制作
A、編寫(xiě)庫(kù)的源代碼 fun.c
B、將其編譯成.o文件
gcc -fPIC -Wall -c fun.c
C、將.o文件生成動(dòng)態(tài)庫(kù)
gcc -shared -fPIC -o libfun.so fun.o
D、編寫(xiě)測(cè)試代碼main.c 并編譯
gcc -o main main.c -L. –lfun
備注:此時(shí)執(zhí)行的話會(huì)出現(xiàn)這樣的錯(cuò)誤提示
原因是動(dòng)態(tài)庫(kù)沒(méi)有裝載,解決這個(gè)問(wèn)題有3種方法:
<1> 將制作的動(dòng)態(tài)庫(kù)放在 /lib或/usr/lib
sudo mv libfun.so /lib/
sudo mv libfun.so /usr/lib/
然后執(zhí)行./main 結(jié)果如下
<2>將制作的動(dòng)態(tài)庫(kù)的當(dāng)前路徑加入庫(kù)的配置文件中
配置文件查找當(dāng)前路徑
進(jìn)入配置文件 sudo vi /etc/ld.so.conf.d/libc.conf
添加路徑
使配置生效 sudo ldconfig
<3>將路徑加入環(huán)境變量中(此方法不靠譜)
查看環(huán)境變量中有沒(méi)有值
echo $LD_LIBRARY_PATH
在環(huán)境變量中加上庫(kù)所在的路徑
export LD_LIBRARY_PATH=/home/leo/IO/16073/auto_lib
使配置生效 sudo ldconfig
3、庫(kù)的升級(jí)(后臺(tái)修改庫(kù),升級(jí)系統(tǒng))
<1> 修改庫(kù)的源代碼
將其編譯生成.o文件
gcc -fPIC -Wall -c fun.c
將.o文件生成動(dòng)態(tài)庫(kù)
gcc -shared -fPIC -o libfun.so fun.o
執(zhí)行 ./main 看效果
升級(jí)成功,以上這些就是靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的知識(shí)了
附件知識(shí):
● -shared:指定生成動(dòng)態(tài)鏈接庫(kù)。
● -static:指定生成靜態(tài)鏈接庫(kù)。(創(chuàng)建靜態(tài)庫(kù)我們一般用ar命令,它將很多.o轉(zhuǎn)換成.a)
● -fPIC:表示編譯為位置獨(dú)立的代碼,用于編譯共享庫(kù)。目標(biāo)文件需要?jiǎng)?chuàng)建成位置無(wú)關(guān)碼,概念上就是在可執(zhí)行程序裝載它們的時(shí)候,它們可以放在可執(zhí)行程序的內(nèi)存里的任何地方。
● -L.:表示要連接的庫(kù)在當(dāng)前目錄中。
● -l:指定鏈接時(shí)需要的動(dòng)態(tài)庫(kù)。編譯器查找動(dòng)態(tài)連接庫(kù)時(shí)有隱含的命名規(guī)則,即在給出的名字前面加上lib,后面加上.so來(lái)確定庫(kù)的名稱。
● -Wall:生成所有警告信息。
● -ggdb:此選項(xiàng)將盡可能的生成gdb的可以使用的調(diào)試信息。
● -g:編譯器在編譯的時(shí)候產(chǎn)生調(diào)試信息。
● -c:只激活預(yù)處理、編譯和匯編,也就是把程序做成目標(biāo)文件(.o文件)。
● -Wl,options:把參數(shù)(options)傳遞給鏈接器ld。如果options中間有逗號(hào),就將options分成多個(gè)選項(xiàng),然后傳遞給鏈接程序。