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