如果我用Rust 语言构建 DLL ,它是否需要libgcc*.dll
在运行时出现?
一方面:
- 我在互联网上的某个地方看到过一个帖子,声称是的。
rustc.exe
在libgcc_s_dw2-1.dll
它的目录下,从http://crates.io网站cargo.exe
下载时没有 dll 将无法运行;
另一方面:
- 我看过关于在 Rust 中构建玩具操作系统内核的文章,所以它们肯定不需要存在 libgcc 动态库。
所以,我很困惑。确定的答案是什么?
如果我用Rust 语言构建 DLL ,它是否需要libgcc*.dll
在运行时出现?
一方面:
rustc.exe
在libgcc_s_dw2-1.dll
它的目录下,从http://crates.io网站cargo.exe
下载时没有 dll 将无法运行;另一方面:
所以,我很困惑。确定的答案是什么?
Rust 为 Windows 提供了两个主要的工具链:x86_64-pc-windows-gnu
和x86_64-pc-windows-msvc
.
-gnu
工具链包括一个环境并使用msys
GCCld.exe
来链接目标文件。此工具链需要libgcc*.dll
在运行时存在。这个工具链的主要优点是它允许您链接到其他msys
提供的库,这可以更容易地链接到在正常 Windows 环境下难以链接的某些 C\C++ 库。
工具链使用标准的-msvc
原生 Windows 开发工具(Windows SDK
安装或Visual Studio
安装)。此工具链libgcc*.dll
在编译或运行时均不使用。由于此工具链使用普通的 Windows 链接器,因此您可以自由链接任何普通的 Windows 本机库。
如果您需要针对 32 位 Windows,i686-
可以使用这两个工具链的变体。
注意:以下答案总结了截至2014年 9 月的情况;我不知道它是否仍然是最新的,或者从那时起事情是否变得更好或更糟。但我强烈怀疑事情已经发生了变化,因为从那时起已经过去了 2 年。如果有人试图再次向 steveklabnik 询问这件事,那会很酷,然后更新下面的信息,或者写一个新的、更新鲜的答案!
与 steveklabnik 的 Rust IRC 聊天的快速原始记录,他给了我一种答案:
你好; 我有一个问题:如果我用 Rust 构建一个 DLL,它是否需要 libgcc*.dll 在运行时出现?(在 Windows 上)
我相信如果您使用标准库,那么它确实需要它;IIRC 我们依赖其中的一个符号;但我不确定。
我怎样才能避免使用标准库,或者它的那些部分呢?(和/或您确切知道哪个符号?)
它涉及您的箱子根目录中的#[no_std];我认为不安全的指南有更多。
运行
nm -D | grep gcc
显示我__gc_personality_v0
,然后是这样的:__gxx_personality_v0 是做什么用的?,所以看起来我们的堆栈展开实现依赖于此。我似乎记得我也看过一些 RFC 以拆分标准库的效果;有没有我可以在不拉入 libgcc 的情况下使用的部分?
是的,libcore不需要任何这些。你放弃libstd。
此外,引用不安全指南的部分内容:
核心库 (libcore) 的依赖项非常少,并且比标准库 (libstd) 本身更具可移植性。此外,核心库具有编写惯用且有效的 Rust 代码所需的大部分功能。(...) 其他库,例如 liballoc,向 libcore 添加了功能,这些功能做出了其他特定于平台的假设,但仍然比标准库本身更具可移植性。
以及展开模块的当前文档片段:
目前 Rust 使用 libgcc 提供的 unwind runtime。
(为了便于阅读,对成绩单进行了轻微编辑。不过,如果有人提供格式更好、更彻底的内容,我会很乐意删除这个答案!)