Attualmente sto provando a scrivere una libreria dinamica con Rust che verrà caricata da un programma esistente. Ho bisogno di esportare alcune funzioni con nomi specifici e convenzioni di chiamata. Tutto funziona, ma non appena ho use
nulla dalla libreria standard:Perché Rust esporta l'intera libreria standard quando crea una DLL?
- I palloncini dimensioni DLL a oltre 3MiB (Non esattamente bella, ma ho potuto vivere con questo)
- L'intera libreria standard viene esportato dal la DLL. Ecco una lista con tutte le esportazioni: http://pastebin.com/LsG1u96C (5100 funzioni)
mi manca un po 'di opzione del compilatore? compilo il seguente codice con rustc
senza alcuna opzione:
#![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]
è l'unica funzione che deve essere esportato.
questo è su una 8.1 macchina Windows con rustc 1.0.0-nightly (522d09dfe 2015-02-19)
(x86)
Aggiornamento: Sembra che quando si compila un file collegato dinamicamente con rustc -C prefer-dynamic
, la dimensione DLL riduce a 60kiB e ci sono solo 3 le esportazioni in più (http://pastebin.com/G0AYZrpF) che sembrano tutti abbastanza ragionevoli. Ma preferirei comunque una libreria collegata staticamente.
La compilazione con ottimizzazioni ('rustc -O',' cargo build --release') ha qualche effetto? Nota che cargo mette binari di rilascio/non-rilascio in diverse directory. – Shepmaster
La compilazione con ottimizzazioni riduce la libreria solo di alcuni kiB, ma non ha altri effetti, lo stesso accade con la build di rilascio del carico. Ma la compilazione di '-C prefer-dynamic' ha un effetto, per favore vedi il mio post aggiornato. – dbeinder
Do '-C lto' o' -C link-args = - gc-sections' fai qualcosa? Non ho idea di me stesso, solo buttandolo fuori. –