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,这两个工具链的
i686-
变体也是可用的。
注意:以下答案总结了截至2014年9月的情况;我不知道现在是否仍然如此,或者自那时以来情况是否有所好转或恶化。但我强烈怀疑事情已经发生了变化,因为已经过去了两年。如果有人试图再次询问steveklabnik然后更新下面的信息或编写新的、更新鲜的答案,那将很酷!
以下是与steveklabnik进行的Rust IRC聊天的快速原始转录,他给了我一种答案:
如果你使用标准库,那么我认为它确实需要;我记得我们依赖它的
一个符号,但我不确定。
如何避免使用标准库或其中的某些部分?(或者你知道具体是哪个符号吗?)
在您的箱根使用 #[no_std];我认为不安全指南有更多信息。
运行nm -D | grep gcc
向我显示__gc_personality_v0
,然后还有这个:What is __gxx_personality_v0 for?,所以我们的堆栈展开实现似乎依赖于那个符号。
我好像记得看到过一些RFC将标准库拆分的内容;有没有部分可以使用而不需要引入libgcc?
是的,libcore不需要任何东西。您放弃了libstd。
此外,引用不安全指南的部分:
核心库(libcore)的依赖很少,比标准库(libstd)本身更具移植性。此外,核心库具有编写 Rust 代码的大多数必要功能。(...)
进一步的库,如liballoc,为libcore添加了功能,这些功能使其他平台特定的假设,但仍然比标准库本身更具可移植性。
以及当前取消模块文档的片段:
目前Rust使用由libgcc提供的取消运行时(unwind runtime)。