【发布时间】:2015-02-21 22:16:30
【问题描述】:
我目前正在尝试使用 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),这些看起来都很合理。但我还是更喜欢静态链接库。
【问题讨论】:
-
用优化编译(
rustc -O,cargo build --release)有什么效果吗?请注意,cargo 将发布/非发布二进制文件放在不同的目录中。 -
使用优化编译只会将库缩小几个 kiB,但没有其他效果,cargo 发布版本也是如此。但是用
-C prefer-dynamic编译有效果,请看我更新的帖子。 -
-C lto或-C link-args=--gc-sections做什么?我自己也不知道,只是把它扔在那里。 -
链接时间优化仅适用于静态库,但我可以使用
rustc -C link-args=-Wl,--gc-sections ldbg.rs编译它。不幸的是,这里也没有效果。