为什么Rust在构buildDLL时导出整个标准库?

我目前正在试图写一个dynamic库与Rust将从现有的程序加载。 我需要导出一些具有特定名称和调用约定的函数。 一切正常,但只要use标准库中的任何东西:

  • DLL的大小超过3MiB(不完全漂亮,但我可以忍受的)
  • 整个标准库从DLL中导出。 这里是所有出口的列表: http : //pastebin.com/LsG1u96C (5100function)

我是否缺less一些编译器开关? 我用rustc编译下面的代码,没有任何选项:

 #![crate_type = "dylib"] #![feature(std_misc)] use std::ffi::CString; #[link(name = "user32")] #[allow(non_snake_case)] extern "stdcall" { fn MessageBoxA(hWnd: u32, lpText: *const i8, lpCaption: *const i8, uType: u32) -> u32; } #[no_mangle] #[allow(non_snake_case)] pub unsafe extern "stdcall" fn _AddLuaState(lua_state_ptr: u32) { let info_str = format!("Lua State Created: {}!", lua_state_ptr); let info_cstring = CString::new(info_str).unwrap(); let caption = CString::new("Hello from my Rust Library!").unwrap(); MessageBoxA(0, info_cstring.as_ptr(), caption.as_ptr(), 0); } 

_AddLuaState@4是唯一应该导出的函数。

这是在Windows 8.1计算机上rustc 1.0.0-nightly (522d09dfe 2015-02-19) (x86)

更新:看起来像编译一个dynamic链接的文件与rustc -C prefer-dynamic ,DLL大小缩小到60kiB,并且只有3个额外的出口( http://pastebin.com/G0AYZrpF ),这些都看起来相当合理。 但我仍然更喜欢静态链接的库。

这可能有助于: 在Windows中的怪物二进制文件

这是谈论可执行文件,但一个DLL基本上只是一个没有主要功能的可执行文件。

最近添加了新的箱子类型“cdylib”,可能更适合您的使用情况。 将源文件的第一行替换为:

 #![crate_type = "cdylib"] 

欲了解更多详情,请看Rust Rust请求#33553 。

在我的测试中,它将简单的“Hello World” DLL的大小从650k(dylib)降低到了8k(cdylib)。 导出的符号数量也大大减少。