如果我使用Rust language构建DLL,是否需要在运行时出现libgcc*.dll
?
一方面:
rustc.exe
在其目录中有libgcc_s_dw2-1.dll
,从http://crates.io网站下载时,cargo.exe
无法在没有dll的情况下运行; 另一方面:
所以,我很困惑。什么是明确的答案?
答案 0 :(得分:8)
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-
个变体。
注意: 以下答案总结了 Sep' 2014 的情况;我不知道它是否仍然是最新的,或者从那时起事情变得更好或更糟。但是我强烈怀疑已经发生了变化,因为从那以后已经过了2年。如果有人试图再次询问steveklabnik,然后更新以下信息,或者写一个新的,更新鲜的答案,那将会很酷!
快速& Rust IRC与steveklabnik聊天的原始记录,他给了我一个答案:
您好;我有一个问题:如果我用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的片段:
目前Rust使用libgcc提供的展开运行时。
(为了便于阅读,我们略微编辑了成绩单。但是,如果有人提供更好的格式化和更全面的内容,我会很乐意删除这个答案!)