日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

為什么不建議交付靜態(tài)鏈接的可執(zhí)行文件給用戶?

來源: 責(zé)編: 時(shí)間:2023-12-18 09:46:26 213觀看
導(dǎo)讀會(huì)C/C++/Go/Rust的開發(fā)者,往往遇到過代碼編譯中需要選擇使用動(dòng)態(tài)還是靜態(tài)鏈接的問題。也知道C/C++開發(fā)中,靜態(tài)編譯不是推薦的做法;而Go語言改進(jìn)了對(duì)靜態(tài)編譯的支持,對(duì)編譯的文件做了優(yōu)化,與 C 語言不同的是,Go 語言的標(biāo)準(zhǔn)庫

會(huì)C/C++/Go/Rust的開發(fā)者,往往遇到過代碼編譯中需要選擇使用動(dòng)態(tài)還是靜態(tài)鏈接的問題。r1k28資訊網(wǎng)——每日最新資訊28at.com

也知道C/C++開發(fā)中,靜態(tài)編譯不是推薦的做法;而Go語言改進(jìn)了對(duì)靜態(tài)編譯的支持,對(duì)編譯的文件做了優(yōu)化,與 C 語言不同的是,Go 語言的標(biāo)準(zhǔn)庫是默認(rèn)靜態(tài)鏈接的,而用戶編寫的代碼可以選擇使用動(dòng)態(tài)鏈接庫或靜態(tài)鏈接庫。r1k28資訊網(wǎng)——每日最新資訊28at.com

問題來了:如果C代碼文件include的頭文件包含很多庫函數(shù),但main() 函數(shù)只用到其中一個(gè)函數(shù),那么生成靜態(tài)鏈接的可執(zhí)行文件的時(shí)候,linux gcc編譯器會(huì)把庫函數(shù)中未用到的庫函數(shù)也包含到可執(zhí)行文件里嗎?r1k28資訊網(wǎng)——每日最新資訊28at.com

r1k28資訊網(wǎng)——每日最新資訊28at.com

知識(shí)點(diǎn):Linux的動(dòng)態(tài)庫靜態(tài)庫

在 Linux 系統(tǒng)中,動(dòng)態(tài)庫和靜態(tài)庫是兩種不同類型的庫文件,它們?cè)诔绦虻木幾g和運(yùn)行過程中扮演著不同的角色。r1k28資訊網(wǎng)——每日最新資訊28at.com

  • Linux下的動(dòng)態(tài)庫(Dynamic Library)是指在程序運(yùn)行時(shí)動(dòng)態(tài)加載和鏈接的庫文件。動(dòng)態(tài)庫通常以.so(Shared Object)為后綴名,它們包含了可執(zhí)行代碼和數(shù)據(jù),可以被多個(gè)程序共享。動(dòng)態(tài)庫的優(yōu)點(diǎn)是可以減少程序的大小,提高內(nèi)存利用率,并且可以在程序運(yùn)行時(shí)動(dòng)態(tài)加載和更新庫文件。Linux下的靜態(tài)庫(Static Library)是指在程序編譯時(shí)被靜態(tài)鏈接到可執(zhí)行文件中的庫文件。靜態(tài)庫通常以.a(Archive)為后綴名,它們包含了可執(zhí)行代碼和數(shù)據(jù),并且在程序編譯時(shí)被直接嵌入到可執(zhí)行文件中。靜態(tài)庫的優(yōu)點(diǎn)是可以提高程序的運(yùn)行速度,因?yàn)椴恍枰诔绦蜻\(yùn)行時(shí)動(dòng)態(tài)加載庫文件。
  • 動(dòng)態(tài)庫和靜態(tài)庫通常存儲(chǔ)在系統(tǒng)的標(biāo)準(zhǔn)庫路徑下,具體位置取決于操作系統(tǒng)和編譯器的配置。在 Linux 系統(tǒng)中,動(dòng)態(tài)庫通常存儲(chǔ)在/lib和/usr/lib目錄下,而靜態(tài)庫通常存儲(chǔ)在/lib和/usr/lib目錄或/usr/lib64目錄下的lib.a子目錄中。

你可以在/etc/ld.so.conf 系統(tǒng)配置文件中指定動(dòng)態(tài)庫的路徑,然后使用sudo ldconfig命令來更新動(dòng)態(tài)庫的緩存,以確保程序能夠正確地找到動(dòng)態(tài)庫。你還可以使用ldd命令來查看程序所依賴的動(dòng)態(tài)庫。r1k28資訊網(wǎng)——每日最新資訊28at.com

實(shí)際上 /etc/ld.so.conf 文件的內(nèi)容是:r1k28資訊網(wǎng)——每日最新資訊28at.com

include /etc/ld.so.conf.d/*.conf

所以當(dāng)你需要告訴系統(tǒng),去加載自己特定目錄下的動(dòng)態(tài)庫所在目錄的時(shí)候,就可以在/etc/ld.so.conf.d/ 目錄下新建以.conf后綴的文本文件,然后sudo ldconfig,就可以更新linux的動(dòng)態(tài)庫緩存信息,系統(tǒng)就能知道你的路徑下的動(dòng)態(tài)庫的存在。r1k28資訊網(wǎng)——每日最新資訊28at.com

最后回答本文開頭提出的那個(gè)問題:r1k28資訊網(wǎng)——每日最新資訊28at.com

C代碼文件在生成靜態(tài)鏈接的可執(zhí)行文件時(shí),Linux GCC 編譯器會(huì)將頭文件中所有聲明的函數(shù)都包含到可執(zhí)行文件中,無論它們是否被 main()函數(shù)直接使用。r1k28資訊網(wǎng)——每日最新資訊28at.com

r1k28資訊網(wǎng)——每日最新資訊28at.com

這是因?yàn)樵陟o態(tài)鏈接中,編譯器會(huì)將所有用到的庫函數(shù)都直接嵌入到可執(zhí)行文件中,以確保程序在運(yùn)行時(shí)不需要依賴外部庫文件。因此,即使 main()函數(shù)只使用了頭文件中聲明的一個(gè)函數(shù),編譯器仍然會(huì)將頭文件中所有聲明的函數(shù)都包含到可執(zhí)行文件中。r1k28資訊網(wǎng)——每日最新資訊28at.com

這可能會(huì)導(dǎo)致可執(zhí)行文件的大小增加,但可以確保程序在運(yùn)行時(shí)不需要依賴外部庫文件,從而提高了程序的獨(dú)立性和可移植性。r1k28資訊網(wǎng)——每日最新資訊28at.com

如果希望減少可執(zhí)行文件的大小,可以考慮使用動(dòng)態(tài)鏈接庫SO(Windows下是DLL,Mac下為dylib后綴的)來實(shí)現(xiàn)庫函數(shù)的共享。對(duì)于操作系統(tǒng)來說,多個(gè)應(yīng)用軟件都依賴同一個(gè)動(dòng)態(tài)庫,那么動(dòng)態(tài)庫的文件只需要一份,這比起靜態(tài)庫,大大減少了磁盤占用,也提高了操作系統(tǒng)的內(nèi)存資源管理效率。r1k28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-48342-0.html為什么不建議交付靜態(tài)鏈接的可執(zhí)行文件給用戶?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: C++17中的if和switch語句初始化

下一篇: 嘗試借助CSS @container實(shí)現(xiàn)多行文本展開收起

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 平定县| 苍山县| 镶黄旗| 惠来县| 阿拉善盟| 兴义市| 济源市| 孟津县| 平原县| 张掖市| 荥阳市| 射阳县| 丹阳市| 彭州市| 宜川县| 靖边县| 陕西省| 墨竹工卡县| 多伦县| 浙江省| 盐山县| 湖州市| 如皋市| 太湖县| 芒康县| 东山县| 自治县| 曲松县| 星座| 盐边县| 蓬莱市| 建昌县| 襄汾县| 辉南县| 宁明县| 湟中县| 项城市| 仪征市| 侯马市| 灌南县| 项城市|