2014-09-26 60 views
5

如果我用Rust language构建一个DLL,它是否需要libgcc*.dll在运行时出现?用Rust构建的DLL需要运行时libgcc.dll吗?

一方面:

  • 我已经看到了互联网上某处一个帖子,声称是它;
  • rustc.exe在其目录中有libgcc_s_dw2-1.dll,并且cargo.exe在从http://crates.io网站下载时不会运行没有dll;

在另一方面:

  • 我已经看到了有关锈建筑玩具操作系统内核的文章,所以他们肯定不需要libgcc的动态库存在。

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

回答

8

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,则这两个工具链的变体都可用。


注:下面的答案总结形势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中提供的展开运行。

(该副本是为可读性略有修改。不过,我会高兴地删除这个答案,如果有人提供更好的东西格式化,更彻底!)

相关问题