久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 靜態(tai)庫和(he)動(dong)態(tai)庫的制作

靜態(tai)庫和動態(tai)庫的制(zhi)作 時間:2018-09-26      來(lai)源(yuan):未知

一、什么叫做庫:

庫:二進制的程(cheng)序,能被操作(zuo)系統載入內存(cun)中執行

二、Linux下的庫有兩種:靜態(tai)庫(ku)(ku)和共享(xiang)庫(ku)(ku)(動態(tai)庫(ku)(ku)),二者的(de)不(bu)同點在于代(dai)碼載入的(de)時刻不(bu)同。

A、靜態庫在程序編譯(yi)的時(shi)(shi)候并會被連接(jie)到(dao)目標代碼(ma)中,程序運行時(shi)(shi)將不再(zai)需要該靜態庫,因此體積較大

B、動態庫(ku)在程(cheng)序編譯的時(shi)候并不會(hui)被連接到目標代碼中,而是在程(cheng)序運(yun)行時(shi)被載入(ru),因(yin)此程(cheng)序運(yun)行時(shi)還需(xu)要動態庫(ku)存在,因(yin)此目標代碼體積小。

1、靜態庫的制作(zuo)

A、創建靜態庫(ku)的(de)源代碼 fun.c

B、將源代碼編譯(yi)成(cheng).o文件(jian)

gcc -c fun.c -o fun.o

gcc -c -o fun.o fun.c

C、將.o文件(jian)生成靜(jing)態庫(ku)

ar crs libfun.a fun.o(ar是(shi)生成靜(jing)態(tai)庫的(de)命令,crs是(shi)選(xuan)項)

ar crs的諧音是(shi)愛人(ren)才認(ren)識(shi)

靜態庫的命名規(gui)則:libxxx.a xxx表示庫名

D、編寫(xie)測試代碼并編譯(-L 指定路徑(jing) –lfun指定庫)

gcc main.c -o main -lfun -L. 庫在當前目錄

gcc -o main main.c -L. –lfun 一樣的(de)效果

gcc main.c -o main -lfun -L.. 庫在上一(yi)級目(mu)錄

gcc main.c -o main -lfun -L ../auto_lib/ 庫在上一級(ji)目錄的auto_lib路徑下面

E、執行(xing) ./main

2、動態庫的制作

A、編寫庫的源代碼 fun.c

B、將其編譯成.o文件

gcc -fPIC -Wall -c fun.c

C、將(jiang).o文件生(sheng)成(cheng)動態庫

gcc -shared -fPIC -o libfun.so fun.o

D、編(bian)寫(xie)測試代碼main.c 并(bing)編(bian)譯

gcc -o main main.c -L. –lfun

備注:此時執行的話會(hui)出現這樣的錯誤(wu)提示(shi)

原因是動態庫沒(mei)有裝載,解決這個問題有3種方法:

<1> 將制作的動態(tai)庫放在 /lib或/usr/lib

sudo mv libfun.so /lib/

sudo mv libfun.so /usr/lib/

然后執行./main 結果如下

<2>將制作的動態庫的當前路徑加入庫的配置(zhi)文件(jian)中

配置文件查找當前路徑

進入配置文件 sudo vi /etc/ld.so.conf.d/libc.conf

添加路徑

使配(pei)置生效 sudo ldconfig

<3>將路徑(jing)加入環境(jing)變量中(此方法不靠譜)

查看(kan)環(huan)境變量中有(you)沒有(you)值

echo $LD_LIBRARY_PATH

在環境變量中(zhong)加(jia)上庫(ku)所(suo)在的路徑

export LD_LIBRARY_PATH=/home/leo/IO/16073/auto_lib

使(shi)配置生效 sudo ldconfig

3、庫的升級(后臺修改庫,升級系(xi)統(tong))

<1> 修改庫(ku)的源代碼

將其(qi)編譯生成.o文(wen)件

gcc -fPIC -Wall -c fun.c

將.o文件(jian)生成動態庫

gcc -shared -fPIC -o libfun.so fun.o

執(zhi)行 ./main 看效果

升級成功,以上這(zhe)些就是靜(jing)態(tai)庫和動態(tai)庫的知識(shi)了

附件知識:

 -shared:指(zhi)定生成(cheng)動態(tai)鏈接庫。

 -static:指定生成靜態鏈接庫。(創建靜態庫我們一般用ar命令,它(ta)將很多.o轉換成.a)

 -fPIC:表示編譯為(wei)位(wei)置獨立的代(dai)碼,用于編譯共享庫。目(mu)標(biao)文件需要創建成位(wei)置無關碼,概(gai)念上就(jiu)是在(zai)可(ke)執(zhi)行程序裝(zhuang)載(zai)它(ta)們(men)的時候(hou),它(ta)們(men)可(ke)以放(fang)在(zai)可(ke)執(zhi)行程序的內存里的任(ren)何地(di)方。

 -L.:表示要連接的庫(ku)在當前目(mu)錄中。

 -l:指定鏈接(jie)(jie)時需要的動態(tai)庫。編譯器查找動態(tai)連接(jie)(jie)庫時有(you)隱含的命名(ming)(ming)規則,即在給出的名(ming)(ming)字(zi)前面加上(shang)lib,后面加上(shang).so來(lai)確定庫的名(ming)(ming)稱。

 -Wall:生成所有警告信息。

 -ggdb:此選項將盡(jin)可(ke)能的(de)(de)生成gdb的(de)(de)可(ke)以使(shi)用的(de)(de)調試信息。

 -g:編譯(yi)器在編譯(yi)的(de)時候產生調(diao)試信息。

 -c:只(zhi)激活預處(chu)理(li)、編(bian)譯和(he)匯(hui)編(bian),也就是把程序做成(cheng)目標文件(jian)(.o文件(jian))。

 -Wl,options:把參數(options)傳(chuan)遞給(gei)(gei)鏈接器ld。如果options中間有逗號,就將options分成多個選(xuan)項,然后傳(chuan)遞給(gei)(gei)鏈接程序。

上一篇:scanf函數簡單問題討論

下一篇:sqlite入門基礎(一):sqlite3_open,sqlite3_exec,slite3_close

熱點文(wen)章(zhang)推薦(jian)
華清學員就業榜(bang)單(dan)
高薪學員(yuan)經驗(yan)分(fen)享
熱(re)點新聞推薦
前臺專(zhuan)線:010-82525158 企業培訓洽談專線(xian):010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部