为什么Rust在构建DLL时会导出整个标准库?

时间:2015-02-21 22:16:30

标签: windows dll rust ffi

我目前正在尝试使用Rust编写一个动态库,该库将从现有程序加载。我需要导出一些具有特定名称和调用约定的函数。一切正常,但只要我use标准库中的任何内容:

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

我错过了一些编译器开关吗? 我使用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是唯一应该导出的函数。

这是在具有rustc 1.0.0-nightly (522d09dfe 2015-02-19)(x86)

的Windows 8.1计算机上

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

1 个答案:

答案 0 :(得分:2)

最近新的箱子类型" cdylib"已添加,可能更适合您的用例。用以下内容替换源文件的第一行:

#![crate_type = "cdylib"]

有关详细信息,请查看Rust pull request #33553

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