man標(biāo)準(zhǔn)文檔中

創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括海勃灣網(wǎng)站建設(shè)、海勃灣網(wǎng)站制作、海勃灣網(wǎng)頁(yè)制作以及海勃灣網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,海勃灣網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到海勃灣省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
c Create the archive. The specified archive is always created if it did not exist, when you request an update. But a warning is issued unless you
specify in advance that you expect to create it, by using this modifier.
說(shuō)明-c只是在不存在的時(shí)候創(chuàng)建。 如果已經(jīng)存在 則-c沒什么作用。
linux庫(kù)有動(dòng)態(tài)與靜態(tài)兩種,動(dòng)態(tài)通常用.so為后綴,靜態(tài)用.a為后綴。例如:libhello.so
libhello.a
為了在同一系統(tǒng)中使用不同版本的庫(kù),可以在庫(kù)文件名后加上版本號(hào)為后綴,例如:
libhello.so.1.0,由于程序連接默認(rèn)以.so為文件后綴名。所以為了使用這些庫(kù),通常使用建立符號(hào)連接的方式。
ln
-s
libhello.so.1.0
libhello.so.1
ln
-s
libhello.so.1
libhello.so
動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的區(qū)別:
當(dāng)要使用靜態(tài)的程序庫(kù)時(shí),連接器會(huì)找出程序所需的函數(shù),然后將它們拷貝到執(zhí)行文件,由于這種拷貝是完整的,所以一旦連接成功,靜態(tài)程序庫(kù)也就不再需要了。然而,對(duì)動(dòng)態(tài)庫(kù)而言,就不是這樣。動(dòng)態(tài)庫(kù)會(huì)在執(zhí)行程序內(nèi)留下一個(gè)標(biāo)記‘指明當(dāng)程序執(zhí)行時(shí),首先必須載入這個(gè)庫(kù)。由于動(dòng)態(tài)庫(kù)節(jié)省空間,linux下進(jìn)行連接的缺省操作是首先連接動(dòng)態(tài)庫(kù),也就是說(shuō),如果同時(shí)存在靜態(tài)和動(dòng)態(tài)庫(kù),不特別指定的話,將與動(dòng)態(tài)庫(kù)相連接。
兩種庫(kù)的編譯產(chǎn)生方法:
第一步要把源代碼編繹成目標(biāo)代碼。以下面的代碼hello.c為例,生成hello庫(kù):
/*
hello.c
*/
#include
void
sayhello()
{
printf("hello,world\n");
}
用gcc編繹該文件,在編繹時(shí)可以使用任何全法的編繹參數(shù),例如-g加入調(diào)試代碼等:
gcc
-c
hello.c
-o
hello.o
1.連接成靜態(tài)庫(kù)
連接成靜態(tài)庫(kù)使用ar命令,其實(shí)ar是archive的意思
$ar
cqs
libhello.a
hello.o
2.連接成動(dòng)態(tài)庫(kù)
生成動(dòng)態(tài)庫(kù)用gcc來(lái)完成,由于可能存在多個(gè)版本,因此通常指定版本號(hào):
$gcc
-shared
-wl,-soname,libhello.so.1
-o
libhello.so.1.0
hello.o
另外再建立兩個(gè)符號(hào)連接:
$ln
-s
libhello.so.1.0
libhello.so.1
$ln
-s
libhello.so.1
libhello.so
這樣一個(gè)libhello的動(dòng)態(tài)連接庫(kù)就生成了。最重要的是傳gcc
-shared
參數(shù)使其生成是動(dòng)態(tài)庫(kù)而不是普通執(zhí)行程序。
-wl
表示后面的參數(shù)也就是-soname,libhello.so.1直接傳給連接器ld進(jìn)行處理。實(shí)際上,每一個(gè)庫(kù)都有一個(gè)soname,當(dāng)連接器發(fā)現(xiàn)它正在查找的程序庫(kù)中有這樣一個(gè)名稱,連接器便會(huì)將soname嵌入連結(jié)中的二進(jìn)制文件內(nèi),而不是它正在運(yùn)行的實(shí)際文件名,在程序執(zhí)行期間,程序會(huì)查找擁有
soname名字的文件,%b
1.lipo -info 文件路徑:查看靜態(tài)庫(kù)的支持信息
2.取出arm64架構(gòu)(要求.a必須是NOFat,這里示例是去arm64架構(gòu))
3.使用Linux ar命令
ar -v -t 文件路徑 (表示:顯示庫(kù)的目錄)
用途說(shuō)明
創(chuàng)建靜態(tài)庫(kù)。a文件。用C/C++開發(fā)程序時(shí)經(jīng)常用到,但我很少單獨(dú)在命令行中使用ar命令,一般寫在makefile中,有時(shí)也會(huì)在shell腳 本中用到。關(guān)于Linux下的庫(kù)文件、靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)以及怎樣創(chuàng)建和使用等相關(guān)知識(shí),參見本文后面的相關(guān)資料【3】《關(guān)于Linux靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的分析》。
常用參數(shù)
格式:ar rcs libxxx.a xx1.o xx2.o
參數(shù)r:在庫(kù)中插入模塊(替換)。當(dāng)插入的模塊名已經(jīng)在庫(kù)中存在,則替換同名的模塊。如果若干模塊中有一個(gè)模塊在庫(kù)中不存在,ar顯示一個(gè)錯(cuò)誤消息,并不替換其他同名模塊。默認(rèn)的情況下,新的成員增加在庫(kù)的結(jié)尾處,可以使用其他任選項(xiàng)來(lái)改變?cè)黾拥奈恢谩!?】
參數(shù)c:創(chuàng)建一個(gè)庫(kù)。不管庫(kù)是否存在,都將創(chuàng)建。
參數(shù)s:創(chuàng)建目標(biāo)文件索引,這在創(chuàng)建較大的庫(kù)時(shí)能加快時(shí)間。(補(bǔ)充:如果不需要?jiǎng)?chuàng)建索引,可改成大寫S參數(shù);如果。a文件缺少索引,可以使用ranlib命令添加)
格式:ar t libxxx.a
顯示庫(kù)文件中有哪些目標(biāo)文件,只顯示名稱。
格式:ar tv libxxx.a
顯示庫(kù)文件中有哪些目標(biāo)文件,顯示文件名、時(shí)間、大小等詳細(xì)信息。
格式:nm -s libxxx.a
顯示庫(kù)文件中的索引表。
格式:ranlib libxxx.a
為庫(kù)文件創(chuàng)建索引表。
使用示例
示例一 在shell腳本中使用
Bash代碼
OS=`uname -r`
ar rcs libhycu.a.$OS *.o
示例二 在makefile中使用
Makefile代碼
$(BIN1): $(BIN1_OBJS)
ar rcs $@ $^
示例三 創(chuàng)建并使用靜態(tài)庫(kù)
第一步:編輯源文件,test.h test.c main.c。其中main.c文件中包含main函數(shù),作為程序入口;test.c中包含main函數(shù)中需要用到的函數(shù)。
vi test.h test.c main.c
第二步:將test.c編譯成目標(biāo)文件。
gcc -c test.c
如果test.c無(wú)誤,就會(huì)得到test.o這個(gè)目標(biāo)文件。
第三步:由。o文件創(chuàng)建靜態(tài)庫(kù)。
ar rcs libtest.a test.o
第四步:在程序中使用靜態(tài)庫(kù)。
gcc -o main main.c -L. -ltest
因?yàn)槭庆o態(tài)編譯,生成的執(zhí)行文件可以獨(dú)立于。a文件運(yùn)行。
第五步:執(zhí)行。
./main
示例四 創(chuàng)建并使用動(dòng)態(tài)庫(kù)
第一步:編輯源文件,test.h test.c main.c。其中main.c文件中包含main函數(shù),作為程序入口;test.c中包含main函數(shù)中需要用到的函數(shù)。
vi test.h test.c main.c
第二步:將test.c編譯成目標(biāo)文件。
gcc -c test.c
前面兩步與創(chuàng)建靜態(tài)庫(kù)一致。
第三步:由。o文件創(chuàng)建動(dòng)態(tài)庫(kù)文件。
gcc -shared -fPIC -o libtest.so test.o
第四步:在程序中使用動(dòng)態(tài)庫(kù)。
gcc -o main main.c -L. -ltest
當(dāng)靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)同名時(shí),gcc命令將優(yōu)先使用動(dòng)態(tài)庫(kù)。
第五步:執(zhí)行。
LD_LIBRARY_PATH=. ./main
示例五 查看靜態(tài)庫(kù)中的文件
[root@node56 lib]# ar -t libhycu.a
base64.c.o
binbuf.c.o
cache.c.o
chunk.c.o
codec_a.c.o
…
xort.c.o
[root@node56 lib]#
[root@node56 lib]# ar -tv libhycu.a
rw-r--r-- 0/0 7220 Jul 29 19:18 2011 base64.c.o
rw-r--r-- 0/0 2752 Jul 29 19:18 2011 binbuf.c.o
rw-r--r-- 0/0 19768 Jul 29 19:18 2011 cache.c.o
…
rw-r--r-- 0/0 4580 Jul 29 19:18 2011 xort.c.o
[root@node56 lib]#
[root@node56 lib]# nm -s libhycu.a | less
Archive index:
Base64Enc in base64.c.o
GetBase64Value in base64.c.o
Base64Dec in base64.c.o
encode64 in base64.c.o
decode64 in base64.c.o
check64 in base64.c.o
test64 in base64.c.o
…
chunk_alloc in chunk.c.o
[root@node56 lib]#
靜態(tài)庫(kù)
可以把它想象成是一些代碼的集合,在可執(zhí)行程序運(yùn)行前就已經(jīng)加到了代碼中,成為了執(zhí)行程序的一部分,一般是以.a為后綴的文件名,Windows下后綴為.lib。靜態(tài)庫(kù)的命名也分為三部分,1、前綴:lib,2、庫(kù)的名稱:隨意,如lisi,3、后綴:.a。
靜態(tài)庫(kù)優(yōu)缺點(diǎn)
上面簡(jiǎn)單介紹了靜態(tài)庫(kù),那它自然也會(huì)有優(yōu)缺點(diǎn),這里來(lái)介紹下它的優(yōu)缺點(diǎn)。
優(yōu)點(diǎn):1、在最后,函數(shù)庫(kù)是被打包到應(yīng)用程序中的,實(shí)現(xiàn)函數(shù)本地化、尋址方便、高效。2、程序在運(yùn)行的時(shí)候,與函數(shù)庫(kù)沒有關(guān)系,移植性更強(qiáng)。
缺點(diǎn):1、消耗資源較大,每個(gè)進(jìn)程在使用靜態(tài)庫(kù)的時(shí)候,都要復(fù)制一份才可以,這也就造成了內(nèi)存的消耗。2、在程序更新、部署、發(fā)布的時(shí)候,使用靜態(tài)庫(kù)相對(duì)麻煩,如果一個(gè)靜態(tài)庫(kù)更新了,那它的應(yīng)用程序都需要重新編譯,再發(fā)送給用戶,有的時(shí)候可能只是一個(gè)小的改動(dòng),但對(duì)于用戶來(lái)說(shuō),會(huì)導(dǎo)致整個(gè)程序重新下載。
動(dòng)態(tài)庫(kù)
在程序編譯時(shí)不會(huì)被連接到目標(biāo)代碼中,在后期運(yùn)行時(shí)才會(huì)載入,不同的應(yīng)用程序如果調(diào)用相同的庫(kù),內(nèi)存中只有一份共享庫(kù)的拷貝,也就避免了空間的浪費(fèi)問(wèn)題。一般以.so作為文件后綴名,也分為三部分:1、前綴:lib,2、庫(kù)名稱:自定義,3、后綴:.so
動(dòng)態(tài)庫(kù)優(yōu)缺點(diǎn)
優(yōu)點(diǎn):1、節(jié)省內(nèi)存2、部署、升級(jí)相對(duì)方便,只需要更換動(dòng)態(tài)庫(kù),再重新啟動(dòng)服務(wù)即可。
缺點(diǎn):1、加載速度比靜態(tài)庫(kù)慢2、移植性較差,需要把所有用到的動(dòng)態(tài)庫(kù)進(jìn)行移植。
網(wǎng)頁(yè)名稱:linux的ar命令,ar命令怎么用
網(wǎng)頁(yè)URL:http://chinadenli.net/article26/hsgijg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、定制網(wǎng)站、App開發(fā)、網(wǎng)站設(shè)計(jì)公司、用戶體驗(yàn)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)