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中提供的展开运行。
(该副本是为可读性略有修改。不过,我会高兴地删除这个答案,如果有人提供更好的东西格式化,更彻底!)