偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開(kāi)發(fā) 前端 Linux
在 Linux 系統(tǒng)中,動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)是兩種不同類(lèi)型的庫(kù)文件,它們?cè)诔绦虻木幾g和運(yùn)行過(guò)程中扮演著不同的角色。

會(huì)C/C++/Go/Rust的開(kāi)發(fā)者,往往遇到過(guò)代碼編譯中需要選擇使用動(dòng)態(tài)還是靜態(tài)鏈接的問(wèn)題。

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

問(wèn)題來(lái)了:如果C代碼文件include的頭文件包含很多庫(kù)函數(shù),但main() 函數(shù)只用到其中一個(gè)函數(shù),那么生成靜態(tài)鏈接的可執(zhí)行文件的時(shí)候,linux gcc編譯器會(huì)把庫(kù)函數(shù)中未用到的庫(kù)函數(shù)也包含到可執(zhí)行文件里嗎?

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

在 Linux 系統(tǒng)中,動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)是兩種不同類(lèi)型的庫(kù)文件,它們?cè)诔绦虻木幾g和運(yùn)行過(guò)程中扮演著不同的角色。

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

你可以在/etc/ld.so.conf 系統(tǒng)配置文件中指定動(dòng)態(tài)庫(kù)的路徑,然后使用sudo ldconfig命令來(lái)更新動(dòng)態(tài)庫(kù)的緩存,以確保程序能夠正確地找到動(dòng)態(tài)庫(kù)。你還可以使用ldd命令來(lái)查看程序所依賴(lài)的動(dòng)態(tài)庫(kù)。

實(shí)際上 /etc/ld.so.conf 文件的內(nèi)容是:

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

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

最后回答本文開(kāi)頭提出的那個(gè)問(wèn)題:

C代碼文件在生成靜態(tài)鏈接的可執(zhí)行文件時(shí),Linux GCC 編譯器會(huì)將頭文件中所有聲明的函數(shù)都包含到可執(zhí)行文件中,無(wú)論它們是否被 main()函數(shù)直接使用。

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

這可能會(huì)導(dǎo)致可執(zhí)行文件的大小增加,但可以確保程序在運(yùn)行時(shí)不需要依賴(lài)外部庫(kù)文件,從而提高了程序的獨(dú)立性和可移植性。

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

責(zé)任編輯:趙寧寧 來(lái)源: 深入理解Linux
相關(guān)推薦

2024-08-12 16:42:50

二進(jìn)制工具系統(tǒng)

2015-02-02 11:03:12

2012-01-05 10:37:40

Java

2010-02-22 18:04:27

CentOS mpla

2011-08-09 10:24:19

可執(zhí)行文件病毒病毒

2021-01-12 10:10:41

shell腳本Linux命令

2022-05-11 14:50:34

Python解包執(zhí)行文件

2021-01-08 08:06:19

腳本Shell文件

2017-02-07 10:22:53

2021-01-06 05:29:57

虛擬內(nèi)存文件

2009-06-20 09:21:37

UNIXLINUX

2024-05-06 00:00:00

Go文件瘦身代碼

2023-03-31 23:31:06

.go文本文件

2009-04-16 10:37:17

Javaexejar

2024-05-21 12:01:39

.NET 6開(kāi)發(fā)

2023-09-04 07:14:36

2022-05-20 08:55:02

py文件exepython

2021-01-14 22:17:09

PythonLinux工具

2022-07-12 13:23:59

靜態(tài)鏈接庫(kù)可執(zhí)行文件C 目標(biāo)文件

2022-06-08 09:56:46

靜態(tài)鏈接Linux命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)