运行时使用Rust构build的DLL需要libgcc.dll吗?

如果我使用Rust语言构buildDLL,是否需要libgcc*.dll在运行时出现?

一方面:

  • 我在互联网上看过一个post,声称是的,
  • rustc.exe在其目录下有libgcc_s_dw2-1.dll ,从http://crates.io网站下载时, cargo.exe不会运行;

另一方面:

  • 我见过有关在Rust中构build玩具操作系统内核的文章,所以他们当然不需要libgccdynamic库。

所以,我很困惑。 什么是明确的答案?

Solutions Collecting From Web of "运行时使用Rust构build的DLL需要libgcc.dll吗?"

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,则可以使用i686-这两种工具链的变体。


注:以下回答总结了截至2014年9月的情况 。 我不知道它是否仍然是最新的,或者从那时起事情变得好转或者糟糕。 但是我强烈怀疑事情已经改变了,因为从那以后已经过去了两年。 如果有人试图再次询问steveklabnik,那么这将是很酷,然后更新下面的信息,或写一个新的,更新鲜的答案!


铁锈IRC的快速和原始的成绩单与steveklabnik聊天,谁给了我一种答案:

你好; 我有一个问题:如果我用Rust生成一个DLL,是否需要libgcc * .dll出现在运行时? (在Windows上)

相信 ,如果你使用标准库,那么它确实需要它; IIRC我们依靠它的一个象征; 但我不确定。

我怎样才能避免使用标准库,或者它的那些部分呢? (和/或你确切知道哪个符号?)

它包含#[no_std]在你的箱根上。 我觉得不安全的指南有更多。

运行nm -D | grep gcc nm -D | grep gcc显示我__gc_personality_v0 ,然后是这样的: 什么是__gxx_personality_v0? ,所以看起来像我们的堆栈展开实现取决于。

我似乎还记得,我也看到了一些RFC分裂标准库的效果; 有没有拉动libgcc中可以使用的部分?

是的, libcore不需要这些。 你放弃libstd

另外,引用不安全指南的部分内容:

核心库(libcore)具有很少的依赖关系,比标准库(libstd)本身便携性好得多。 此外,核心库具有编写惯用和有效Rust代码的大部分必要功能。 (…)进一步的库,如liballoc,增加了libcore的功能,使其他平台的具体假设,但继续比标准库本身更容易移植。

当前文档的展开模块的片段:

目前Rust使用libgcc提供的unwind运行时。

(为了便于阅读,这个成绩单被略微编辑了一下,如果有人提供更好的格式和更彻底的话,我会很乐意删除这个答案)。