Почему Rust экспортирует всю стандартную библиотеку при создании DLL?
В настоящее время я пытаюсь написать динамическую библиотеку с 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);
}
[email protected]
- единственная функция, которая должна быть экспортирована.
Это на машине с Windows 8.1 с rustc 1.0.0-nightly (522d09dfe 2015-02-19)
(x86)
Обновление: похоже, при компиляции динамически связанного файла с rustc -C prefer-dynamic
размер DLL уменьшается до 60kiB, и есть только 3 дополнительных экспорта (http://pastebin.com/G0AYZrpF), которые выглядят вполне разумно. Но я бы предпочел статически связанную библиотеку.
Ответы
Ответ 1
Недавно был добавлен новый тип ящика "cdylib", который, вероятно, лучше подходит для вашего варианта использования. Замените первую строку вашего исходного файла на:
#![crate_type = "cdylib"]
При использовании диспетчера пакетов Cargo вместо прямого вызова rustc
обновите Cargo.toml
чтобы он содержал следующие строки:
[lib]
crate-type = ["cdylib"]
Для более подробной информации взгляните на Rust pull request # 33553.
В моем тесте он уменьшил размер следующей простой библиотеки "Hello World" с 650k (dylib) до 8k (cdylib). Также количество экспортируемых символов значительно уменьшено.
#[no_mangle]
pub extern fn hello_rust() -> *const u8 {
"Hello, world!\0".as_ptr()
}