一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Linux|Centos|Ubuntu|系統(tǒng)進程|Fedora|注冊表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務(wù)器之家 - 服務(wù)器系統(tǒng) - Linux - 為什么不建議交付靜態(tài)鏈接的可執(zhí)行文件給用戶?

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

2023-12-18 17:08未知服務(wù)器之家 Linux

會C/C++/Go/Rust的開發(fā)者,往往遇到過代碼編譯中需要選擇使用動態(tài)還是靜態(tài)鏈接的問題。 也知道C/C++開發(fā)中,靜態(tài)編譯不是推薦的做法;而Go語言改進了對靜態(tài)編譯的支持,對編譯的文件做了優(yōu)化,與 C 語言不同的是,Go 語言的標準

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

也知道C/C++開發(fā)中,靜態(tài)編譯不是推薦的做法;而Go語言改進了對靜態(tài)編譯的支持,對編譯的文件做了優(yōu)化,與 C 語言不同的是,Go 語言的標準庫是默認靜態(tài)鏈接的,而用戶編寫的代碼可以選擇使用動態(tài)鏈接庫或靜態(tài)鏈接庫。

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

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

知識點:Linux的動態(tài)庫靜態(tài)庫

在 Linux 系統(tǒng)中,動態(tài)庫和靜態(tài)庫是兩種不同類型的庫文件,它們在程序的編譯和運行過程中扮演著不同的角色。

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

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

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

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

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

最后回答本文開頭提出的那個問題:

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

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美聚众性派对hdsex | 男gay男gay男gay野外 | 亚洲精品m在线观看 | 欧美va天堂va视频va在线 | 色综合久久日韩国产 | 亚洲白拍 | 国产偷窥女洗浴在线观看亚洲 | 四虎成人免费大片在线 | 欧美性一级交视频 | 国产伦精品一区二区三区免费观看 | 1024国产基地永久免费 | 成年性午夜免费视频网站不卡 | 护士让我吃奶我扒她奶 | 欧美一级xxxx俄罗斯一级 | 高清欧美不卡一区二区三区 | 99久久中文字幕伊人 | 深夜日韩 | 男人天堂中文字幕 | 四虎国产成人免费观看 | 国产麻豆剧果冻传媒观看免费视频 | 深夜福利影院 | 久久精品动漫99精品动漫 | 91免费精品国自产拍在线可以看 | 国产精亚洲视频 | aaa一级最新毛片 | 俺去俺来也www色官网免费的 | 午夜无码片在线观看影院 | 国产精品日韩欧美一区二区三区 | 好大好湿好硬好爽好深免费视频 | 亚洲国产中文字幕在线视频综合 | 国产亚洲99影院 | 暖暖在线精品日本中文 | 国产精品酒店视频免费看 | 精品国产在天天线在线麻豆 | 日韩视频免费一区二区三区 | 韩国三级在线高速影院 | 小向美奈子av | 手机看片1024国产 | 亚洲欧美天堂 | 毛片99| 国产精品久久久天天影视香蕉 |