動態庫是像Windows那樣兩個檔案 lib dll 好,還是Linux那樣合二為一 so 好?

時間 2021-05-06 23:05:57

1樓:秦雨貓

誰告訴您說Linux合二為一的?純粹是「現代」Linux發行版的打包工具預設清理靜態庫給您帶來的錯覺而已。

Linux的靜態鏈結庫一般取名為lib某某.a。

2樓:俞文永

分開是為了效能,那些未匯出的函式就無需重定位,在動態庫內部呼叫的時候也無需多次跳轉。

但是合起來比較方便!但是所有的呼叫都變成間接了。

個人比較喜歡.so,畢竟方便。

3樓:不懂

Windows 的lib在用dll的時候,不用你手動載入dll和匯出函式,只是dll必須放在指定位置,並且沒有解除安裝介面。直接用dll可以不需要lib,另外你生成的是靜態庫的時候是沒有dll的。

4樓:TY Sun

可能是合作開發時,只提供一次lib,後續部署直接換dll方便吧。如果直接鏈結dll,那可能需要提供乙個假dll?

dumpbin可以匯出dll的資訊,那實際上VS可以直接鏈結dll。

5樓:程式碼之詩

這個不能直接用「哪個更好」來下結論吧。

Linux 採用 ELF 格式,源頭我不大清楚,似乎是個相當標準化的格式,很多作業系統都用。似乎 ELF 沒有按索引號匯出的功能,裝載器負責給可執行程式填好引入表。很規範,沒什麼好說的。

DLL 是PE格式,它允許匯出表中沒有名字表。這個就是區別所在了。沒有名字就無法根據名字鏈結,這種情況下需要 .

lib 來協助。不用名字表鏈結時麻煩一些,但是執行時還是有好處的,載入速度會快一些,也省一點記憶體。另外,windows下靜態庫也是 .

lib 。微軟給這兩個不同用途的檔案都用 .lib 字尾真是心大。

用 dumpbin 看 dll,用 nm 看 so,其實它們的資訊基本上差不多的,但是有的DLL匯出項沒有名字或者有名字的項特別少,so 就不會這樣,它的匯出項都有名字的。看可執行程式也一樣:Windows 的可執行程式引入表是可以簡略名字直接用序號的,對有些 DLL 的匯入項根本沒有名稱(根據優化引數而異),只有序號。

而Linux 的可執行程式的引入表總是有完整的名稱。

總的說,在 DLL 沒有做名字表優化的情況下(大多如此),.lib 其實並不是必須的,也有工具可以從 DLL 直接生成乙個 .lib。

但是……我也不知道沒有 .lib 情況下如何 implicit link。

6樓:發發啊喂

windows 的dll 正確開啟方式並不需要.lib

你做個dll的工程的時候你就發現了.lib 裡面就放一些無聊的東西.

c 怎麼讓自己寫的庫像標準庫那樣只需include標頭檔案就可以使用而不需要把實現原始碼加入工程裡?

沒辦法像標準庫那樣。標準庫可以只include標頭檔案是因為編譯器會預設鏈結標準庫的實現。其它回答裡面說的header only library,是把實現也一起寫在標頭檔案裡面了。不需要另外的cpp而已。如果你的目的是讓庫方便使用,就做成header only library,或者退一步,提供乙個標...

原始佛教真的像別人說的那樣是烏合嗎

花開生兩面 原始佛教的出現不知道吸收了多少原來大乘佛教的信徒,很大一部分人忍受不了大乘佛教現在魚龍混雜的現況,改學比較純粹的原始佛教。失去了那麼多的信徒,地位也被拉低了那麼多的 大乘佛教 不暴跳如雷才是怪事。他們很多人滿口的 慈悲 但絕大多數人只是表面上的口頭慈悲,當你動了他們的蛋糕,挑戰了他們在華...

為什麼足球界不會像桌球界那樣,出現一兩個國家實力過於強大的局面?

不滅的艹 因為足球是11個人的比賽,單單靠乙個人是贏不了的,不像桌球,羽毛球這種乙個人苦練就行的,足球更要講究配合,戰術等等。儘管葡萄牙有c羅,阿根廷有梅西,但是其他人不行,他們就是拿不了冠軍,這就是足球。 高校裡越是冷門的專業,越有可能乙個學校有絕對優勢,甚至別的學校都索性不開這個專業 而熱門專業...