Rust爲Windows提供了兩個主要工具鏈:x86_64-pc-windows-gnu
和x86_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中提供的展開運行。
(該副本是爲可讀性略有修改。不過,我會高興地刪除這個答案,如果有人提供更好的東西格式化,更徹底!)