2014-09-26 56 views
5

如果我用Rust language構建一個DLL,它是否需要libgcc*.dll在運行時出現?用Rust構建的DLL需要運行時libgcc.dll嗎?

一方面:

  • 我已經看到了互聯網上某處一個帖子,聲稱是它;
  • rustc.exe在其目錄中有libgcc_s_dw2-1.dll,並且cargo.exe在從http://crates.io網站下載時不會運行沒有dll;

在另一方面:

  • 我已經看到了有關鏽建築玩具操作系統內核的文章,所以他們肯定不需要libgcc的動態庫存在。

所以,我很困惑。什麼是明確的答案?

回答

8

Rust爲Windows提供了兩個主要工具鏈:x86_64-pc-windows-gnux86_64-pc-windows-msvc

-gnu工具鏈包含msys環境,並使用GCC的ld.exe鏈接目標文件。該工具鏈要求在運行時存在libgcc*.dll。這個工具鏈的主要優勢在於它允許您鏈接到其他msys提供的庫,這可以使它更容易與某些難以在正常Windows環境下使用的C \ C++庫鏈接。

-msvc工具鏈使用標準的本地Windows開發工具(安裝Windows SDK或安裝Visual Studio)。該工具鏈在編譯或運行時不使用libgcc*.dll。由於此工具鏈使用正常的Windows鏈接程序,因此您可以自由鏈接任何正常的Windows本機庫。

如果您需要定位32位Windows,則這兩個工具鏈的變體都可用。


注:下面的答案總結形勢Sep'2014的;我不知道它是否仍然是最新的,或者自那時以來事情已經改變或好轉。但我強烈懷疑事情改變,因爲從那時起已經過去了2年。如果有人試圖再次詢問steveklabnik,然後更新下面的信息,或寫一個新的,更新的答案,這將是很酷的!


與steveklabnik防鏽IRC聊天,誰給了我這樣回答的

快速&原始成績單:

喜;我有一個問題:如果我使用Rust構建DLL,是否需要libgcc * .dll在運行時才存在?(在Windows上)

相信,如果你使用標準庫,那麼它確實需要它; IIRC我們依靠一個它的符號; 但我不確定。

如何避免使用標準庫或它的那些部分? (和/或你知道哪個符號到底是什麼?)

它涉及到#[no_std]在您的箱子根;我認爲the unsafe guide有更多。

運行nm -D | grep gcc顯示我__gc_personality_v0,再有是這樣的:What is __gxx_personality_v0 for?, 所以看起來我們的棧展開的實施取決於這一點。

我似乎還記得我已經看到一些RFC分裂標準庫的效果;有沒有拉動libgcc可以使用的部分?

是,libcore不需要任何的。 你放棄libstd

the unsafe guide此外,引用部分:

核心庫(libcore)具有很少的依賴性,而且比標準庫(libstd)本身更便攜。此外,核心庫具有編寫慣用和有效Rust代碼的大部分必要功能。 (...) 其他庫(如liballoc)爲libcore添加了一些功能,這些功能使其他平臺特定的假設成爲可能,但仍然比標準庫本身更具可移植性。

和片段當前docs for unwind module的:

目前鏽病使用由libgcc中提供的展開運行。

(該副本是爲可讀性略有修改。不過,我會高興地刪除這個答案,如果有人提供更好的東西格式化,更徹底!)

相關問題