Rust 为 Windows 提供了两个主要工具链:x86_64-pc-windows-gnu
and x86_64-pc-windows-msvc
.
The -gnu
工具链包括一个msys
环境并使用 GCCld.exe
链接目标文件。该工具链需要libgcc*.dll
在运行时出现。该工具链的主要优点是它允许您链接到其他工具链msys
提供的库可以更容易地链接到某些在正常 Windows 环境下难以链接的 C\C++ 库。
The -msvc
工具链使用标准的、本机 Windows 开发工具(Windows SDK
安装或Visual Studio
安装)。该工具链不使用libgcc*.dll
在编译或运行时。由于此工具链使用普通的 Windows 链接器,因此您可以自由链接任何普通的 Windows 本机库。
如果您需要面向 32 位 Windows,i686-
这两个工具链的变体均可用。
NOTE:以下答案总结了截至目前的情况Sep'2014;我不知道它是否仍然是当前的,或者从那时起情况是否变得更好或更糟。但我强烈怀疑事情have改变了,因为从那时起已经过去了两年。如果有人尝试再次询问 steve klabnik,然后更新以下信息,或者写一个新的、更新的答案,那就太酷了!
与 steveklabnik 进行 Rust IRC 聊天的快速原始记录,他给了我一个答案:
你好;我有一个问题:如果我使用 Rust 构建 DLL,它是否需要 libgcc*.dll 在运行时存在? (在 Windows 上)
I believe如果您使用标准库,那么它确实需要它;
我们依赖的 IIRCone来自它的符号;
但我不确定。
我怎样才能避免使用标准库或它的那些部分? (和/或您确切知道哪个符号吗?)
它涉及到你的板条箱根目录中的#[no_std];我认为不安全的指南 http://doc.rust-lang.org/guide-unsafe.html#avoiding-the-standard-library有更多。
Running nm -D | grep gcc
给我看__gc_personality_v0
,然后就是这个:__gxx_personality_v0 是做什么用的? https://stackoverflow.com/q/329059/98528,
所以看起来我们的堆栈展开实现取决于此。
我似乎记得我也看过一些关于分割标准库的 RFC;有哪些部分我可以在不拉入 libgcc 的情况下使用?
Yes, libcore不需要任何这些。
你放弃libstd.
另外,引用部分内容不安全的指南 http://doc.rust-lang.org/guide-unsafe.html#using-libcore:
核心库 (libcore) 的依赖项很少,并且比标准库 (libstd) 本身更易于移植。此外,核心库具有编写惯用且有效的 Rust 代码所需的大部分功能。 (...)
其他库(例如 liballoc)向 libcore 添加了功能,这些功能做出了其他特定于平台的假设,但仍然比标准库本身更具可移植性。
以及当前的片段展开模块的文档 http://doc.rust-lang.org/std/rt/unwind/:
目前 Rust 使用 libgcc 提供的 unwind 运行时。
(The transcript was edited slightly for readability. Still, I'll happily delete this answer if anyone provides something better formatted and more thorough!)