Подтвердить что ты не робот

Почему 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), которые выглядят вполне разумно. Но я бы предпочел статически связанную библиотеку.

4b9b3361

Ответ 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()
}