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

问题描述 投票:12回答:1

我正在尝试用Rust编写一个动态库,它将从现有程序加载。我需要导出一些具有特定名称和调用约定的函数。一切正常,但是只要我从标准库中找到任何东西:

  • DLL大小气球超过3MiB(不完全漂亮,但我可以忍受)
  • 整个标准库从DLL导出。这是一个包含所有出口的列表:use(5100个函数)

我错过了一些编译器开关吗?我使用http://pastebin.com/LsG1u96C编译以下代码,没有任何选项:

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(x86)的Windows 8.1机器上

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

windows dll rust ffi
1个回答
2
投票

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

http://pastebin.com/G0AYZrpF

有关详细信息,请查看#![crate_type = "cdylib"]

在我的测试中,它将简单的Rust pull request #33553 DLL的大小从650k(dylib)降低到8k(cdylib)。导出符号的数量也大量减少。

© www.soinside.com 2019 - 2024. All rights reserved.