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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

关于静态库与动态库【Linux 】【C】

發(fā)布時(shí)間:2023/12/15 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于静态库与动态库【Linux 】【C】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

靜態(tài)庫(kù):
首先將源文件編譯成目標(biāo)文件:gcc –c a.c b.c
生成靜態(tài)庫(kù):ar –rc libstatic.a a.o b.o

?

共享庫(kù):
同靜態(tài)庫(kù)一樣編譯成目標(biāo)文件:gcc –c a.c b.c
生成共享庫(kù):gcc –fPIC –shared –o libshared.so a.o b.o

?

靜態(tài)庫(kù)的鏈接方法:
gcc –o staticcode –L. –lstatic main.c –static(默認(rèn)庫(kù)在當(dāng)前文件夾)

共享庫(kù)的鏈接方法:
gcc –o sharedcode? -L. –lshared main.c(默認(rèn)庫(kù)在當(dāng)前文件夾)

?

靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)都是對(duì)目標(biāo)文件的處理,也可以說(shuō)庫(kù)文件已經(jīng)是機(jī)器碼文件了,靜態(tài)庫(kù)和共享庫(kù)的加載過(guò)程有很大的區(qū)別。

靜態(tài)庫(kù)的鏈接方法:
gcc –o staticcode –L. –lstatic main.c –static(默認(rèn)庫(kù)在當(dāng)前文件夾)

?

共享庫(kù)的鏈接方法:
gcc –o sharedcode? -L. –lshared main.c(默認(rèn)庫(kù)在當(dāng)前文件夾)

?? 當(dāng)程序與靜態(tài)庫(kù)連接時(shí),庫(kù)中目標(biāo)文件所含的所有將被程序使用的函數(shù)的機(jī)器碼被copy到最終的可執(zhí)行文件中。這就會(huì)導(dǎo)致最終生成的可執(zhí)行代碼量相對(duì)變多,相當(dāng)于編譯器將代碼補(bǔ)充完整了,這樣運(yùn)行起來(lái)相對(duì)就快些。不過(guò)會(huì)有個(gè)缺點(diǎn): 占用磁盤和內(nèi)存空間. 靜態(tài)庫(kù)會(huì)被添加到和它連接的每個(gè)程序中,而且這些程序運(yùn)行時(shí), 都會(huì)被加載到內(nèi)存中. 無(wú)形中又多消耗了更多的內(nèi)存空間.

?????? 與共享庫(kù)連接的可執(zhí)行文件只包含它需要的函數(shù)的引用表,而不是所有的函數(shù)代碼,只有在程序執(zhí)行時(shí),那些需要的函數(shù)代碼才被拷貝到內(nèi)存中。這樣就使可執(zhí)行文件比較小,節(jié)省磁盤空間,更進(jìn)一步,操作系統(tǒng)使用虛擬內(nèi)存,使得一份共享庫(kù)駐留在內(nèi)存中被多個(gè)程序使用,也同時(shí)節(jié)約了內(nèi)存。不過(guò)由于運(yùn)行時(shí)要去鏈接庫(kù)會(huì)花費(fèi)一定的時(shí)間,執(zhí)行速度相對(duì)會(huì)慢一些,總的來(lái)說(shuō)靜態(tài)庫(kù)是犧牲了空間效率,換取了時(shí)間效率,共享庫(kù)是犧牲了時(shí)間效率換取了空間效率,沒有好與壞的區(qū)別,只看具體需要了。

??????? 另外,.一個(gè)程序編好后,有時(shí)需要做一些修改和優(yōu)化,如果我們要修改的剛好是庫(kù)函數(shù)的話,在接口不變的前提下,使用共享庫(kù)的程序只需要將共享庫(kù)重新編譯就可以了,而使用靜態(tài)庫(kù)的程序則需要將靜態(tài)庫(kù)重新編譯好后,將程序再重新編譯一便。

庫(kù)操作的相關(guān)命令
nm
功能:
列出編入目標(biāo)文件或二進(jìn)制文件的所有符號(hào)。
用途一:查看程序調(diào)用什么函數(shù);
用途二:查看一個(gè)給定的庫(kù)或目標(biāo)文件是否提供了所需的函數(shù)。

語(yǔ)法:nm [options] file
常用選項(xiàng):
-C 將符號(hào)名轉(zhuǎn)換為用戶級(jí)的名字。在讓C++函數(shù)名可讀方面特別有用。
-s 當(dāng)用于.a文件時(shí),輸出把符號(hào)名映射到定義該符號(hào)的模塊或成員名的索引。
-u 只顯示未定義的符號(hào),即在被檢查的文件外部定義的文件。
-l? 使用調(diào)試信息輸出定義每個(gè)符號(hào)的行號(hào),或未定義符號(hào)的重要位項(xiàng)。

ar
功能:將多個(gè).o文件組合到一起成為.a文件。
語(yǔ)法:ar [options] lib*.a *.o
常用選項(xiàng):
-c 如果存檔文件不存在,則創(chuàng)建,并不顯示ar發(fā)出的警告。
-q 把*.o添加到存檔文件末尾而不檢查是否進(jìn)行替換。
-r? 向存檔文件中插入.o文件,替換已有的任何同名文件,新成員添加到文檔末尾。
-s 創(chuàng)建或升級(jí)從符號(hào)到.a文件之間的交叉索引映射表,并加入到.a文件中。
?? 等價(jià)與ranlib [*.a]。執(zhí)行該命令后,可用nm –s來(lái)查看生成的索引。
ldd
功能:顯示可執(zhí)行程序運(yùn)行所需的共享庫(kù)。
語(yǔ)法
ldd [options] file
常用選項(xiàng):
-d 執(zhí)行重定位并報(bào)告所有丟失的函數(shù)。
-r 執(zhí)行對(duì)函數(shù)和數(shù)據(jù)對(duì)象的重定位并報(bào)告丟失的任何函數(shù)或數(shù)據(jù)對(duì)象。

ldconfig
功能:
在默認(rèn)搜尋目錄(/lib和/usr/lib)及動(dòng)態(tài)庫(kù)配置文件/etc/ld.so.conf中所列的目錄下,
搜索出可共享的動(dòng)態(tài)鏈接庫(kù)(lib*.so*),進(jìn)而創(chuàng)建出動(dòng)態(tài)裝入程序(ld.so)所需的連接和緩存文件。
緩存文件默認(rèn)為/etc/ld.so.cache,此文件保存了已排好序的動(dòng)態(tài)鏈接庫(kù)名字列表。
該在系統(tǒng)啟動(dòng)時(shí)會(huì)運(yùn)行,而當(dāng)用戶安裝了一個(gè)新的動(dòng)態(tài)鏈接庫(kù)時(shí),就需要手工運(yùn)行這個(gè)命令。
語(yǔ)法:
ldconfig [options] path

例如:ldconfig /root/lib讓系統(tǒng)共享/root/lib目錄下的動(dòng)態(tài)鏈接庫(kù),即在/etc/ld.so.cache中添加指定目錄下的共享庫(kù)。
[注意]若該目錄不在/lib,/usr/lib,/etc/ld.soconf所列的目錄列表里,則再次運(yùn)行l(wèi)dconf時(shí),此目錄下的動(dòng)態(tài)鏈接庫(kù)就不被系統(tǒng)共享了。

常用選項(xiàng):
-v 更新/etc/ld.so.cache的內(nèi)容,列處每個(gè)庫(kù)的版本號(hào),掃描的目錄和所有創(chuàng)建和更新的鏈接。
-p 僅顯示/etc/ld.so.cache的內(nèi)容,即ld.so所知道的共享庫(kù)的當(dāng)前列表。
-n? ldconf僅掃描-n命令所指定的目錄
-f CONF?? 指定動(dòng)態(tài)鏈接庫(kù)的配置文件為CONF,系統(tǒng)默認(rèn)為/etc/ld.so.conf。
-c CACHE? 指定生成的緩存文件為CACHE,系統(tǒng)默認(rèn)為/etc/ld.so.cache。
當(dāng)ldconf不帶選項(xiàng)時(shí),僅更新高速緩沖文件。

環(huán)境變量
$LD_PRELOAD????? 由空格分隔的共享庫(kù)列表,在其它庫(kù)之前加載,使它們有機(jī)會(huì)覆蓋或重新定義標(biāo)準(zhǔn)庫(kù)。
$LD_LIBRARY_PATH 由冒號(hào)分隔的目錄清單,都是共享庫(kù)搜索時(shí)會(huì)訪問(wèn)的目錄。

?

總結(jié)

以上是生活随笔為你收集整理的关于静态库与动态库【Linux 】【C】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。