最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++靜態(tài)鏈接與動態(tài)鏈接詳解

 更新時間:2021年10月11日 11:16:25   作者:xmlsunny  
下面小編就為大家介紹C++靜態(tài)鏈接與動態(tài)鏈接。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、GCC工作流程

預(yù)處理:把#頭文件展開,進(jìn)行宏替換,去掉注釋(生成.i文件)

編譯:把預(yù)處理后的文件生成匯編文件(.s文件),主要是檢查語法、語義問題

匯編:把匯編文件生成目標(biāo)文件(.o文件)

鏈接:將函數(shù)庫中相應(yīng)的代碼組合到目標(biāo)文件,生成可執(zhí)行文件(默認(rèn)a.out文件)

o文件不會立即執(zhí)行,因為可能出現(xiàn):一個.cpp文件中的函數(shù)引用了另一個.cpp文件中定義的符號/調(diào)用了某個庫文件中的函數(shù)。鏈接的目的就是將這些文件對應(yīng)的目標(biāo)文件鏈接成一個整體,從而生成可執(zhí)行文件。

二、靜態(tài)鏈接與動態(tài)鏈接

程序庫:包含數(shù)據(jù)和執(zhí)行代碼的文件,不能單獨執(zhí)行,可以作為程序庫的一部分來完成某些功能。

庫的存在可以使程序模塊化,可以加快程序的再編譯,實現(xiàn)代碼復(fù)用,便于更新程序

程序庫又分為靜態(tài)鏈接庫與動態(tài)鏈接庫

1、靜態(tài)鏈接

在鏈接階段,將匯編生成的.o文件和所需要的庫一起鏈接打包到可執(zhí)行文件中去,程序運行的時候不再調(diào)用其它的庫文件

一個靜態(tài)庫,可以看作是一些目標(biāo)代碼的集合,在可執(zhí)行程序運行前就已經(jīng)加入到執(zhí)行代碼中,成為執(zhí)行程序的一部分。

靜態(tài)鏈接的優(yōu)點:對運行環(huán)境依賴小,具有較好的兼容性。

靜態(tài)鏈接的缺點:生成的程序較大,需要更多的系統(tǒng)資源(所需的所有庫都被打包進(jìn)可執(zhí)行文件了),在裝入內(nèi)存中消耗更多時間

一旦庫函數(shù)有了更新,必須重新編譯應(yīng)用程序

此處,我們制作實現(xiàn)加減乘除的靜態(tài)庫,首先編寫add.c、sub.c、mul.c、div.c文件及對應(yīng).h文件,另外編寫text.c文件進(jìn)行測試。gcc -c 生成目標(biāo)文件.o,然后將.o文件打包,制作靜態(tài)庫libtext.a

2、動態(tài)鏈接

靜態(tài)庫存在的問題:

(1)若兩個.o文件都使用同一個靜態(tài)庫,那么內(nèi)存中會拷貝2份靜態(tài)庫的代碼,然 后分別與兩個.o文件一起打包到可執(zhí)行文件中,造成空間浪費。

舉個例子:某個靜態(tài)庫占1M內(nèi)存,有2000個.o文件使用這個靜態(tài)庫,內(nèi)存中有2000個靜態(tài)庫的代碼(將近2000GB),空間浪費嚴(yán)重。

(2) 所需的庫被拷貝到可執(zhí)行文件中去了,如果某個庫更新了,則與它相關(guān)的所有可執(zhí)行文件都需要重新編譯。

為了解決這兩個問題,引出動態(tài)庫(又稱共享庫),動態(tài)庫在程序編譯時,并不會被鏈接到目標(biāo)代碼中,而是在運行時載入,不同應(yīng)用程序如果調(diào)用相同的的庫,內(nèi)存里只有一份共享庫的實例,避免了浪費。由于動態(tài)庫在運行時才被載入,也解決了靜態(tài)庫對程序的更新、部署和發(fā)布帶來的馬糞,用戶只需要更新動態(tài)庫即可。

動態(tài)鏈接的優(yōu)點:鏈接時,僅僅建立與所需庫函數(shù)之間的關(guān)系;

在程序運行時才將所需資源調(diào)入可執(zhí)行程序;

簡化程序的升級,有較小的程序體積;

實現(xiàn)進(jìn)程之間的資源共享,內(nèi)存中只有一份動態(tài)庫的實例,避免充分拷貝

動態(tài)鏈接的缺點:依賴動態(tài)庫,不能獨立運行

動態(tài)庫依賴版本問題嚴(yán)重

同樣的,我們制作制作實現(xiàn)加減乘除的動態(tài)庫。

我們把動態(tài)庫.so和測試文件.c拷貝當(dāng)前目錄,使得系統(tǒng)加載可執(zhí)行文件時,能夠知道所依賴的庫的名字,但是還需要找到動態(tài)庫的絕對路徑,此時需要系統(tǒng)動態(tài)載入器(dynamic linker/loader)。對于elf格式的可執(zhí)行程序,是由ld-linux.so*來完成的。搜索elf文件的DT_PATH段(環(huán)境變量)LD_LIBRARY_PATH,/etc/ld.so.cache文件列表,/urs/lib目錄找到庫文件后將其載入內(nèi)存。

動態(tài)庫加載失敗的解決辦法:這里給出兩個解決辦法,來找到動態(tài)庫

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++ 算法精講之貪心算法

    C++ 算法精講之貪心算法

    貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當(dāng)前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解
    2022-03-03
  • C/C++程序設(shè)計的基本概念詳解

    C/C++程序設(shè)計的基本概念詳解

    這篇文章主要介紹了C++程序設(shè)計的基本概念詳解,文中有非常詳細(xì)的C語言使用教程及相關(guān)基礎(chǔ)知識,對正在學(xué)習(xí)c語言的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-09-09
  • 最新評論

    汝州市| 高青县| 会泽县| 库车县| 邯郸市| 吉木萨尔县| 西充县| 开远市| 尉氏县| 集安市| 鸡泽县| 清流县| 太谷县| 永城市| 芦山县| 门源| 老河口市| 孝感市| 湘潭县| 高邮市| 资源县| 盐津县| 苍南县| 徐闻县| 铜鼓县| 奉贤区| 松桃| 洮南市| 曲麻莱县| 瑞昌市| 云南省| 金门县| 玉山县| 黎平县| 筠连县| 治多县| 尤溪县| 阳原县| 岳池县| 抚顺县| 水富县|