2015-02-21 10 views
12

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.

+0

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

+1

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

+0

Do '-C lto' o' -C link-args = - gc-sections' fai qualcosa? Non ho idea di me stesso, solo buttandolo fuori. –

risposta

2

Recentemente è stato aggiunto il nuovo tipo di cassa "cdylib" che probabilmente si adatta meglio al caso d'uso. Sostituire la prima riga del file sorgente con:

#![crate_type = "cdylib"] 

Per maggiori dettagli un'occhiata a Rust pull request #33553.

Nel mio test ha ridotto le dimensioni di una semplice DLL "Hello World" da 650k (dylib) fino a 8k (cdylib). Anche il numero di simboli esportati è diminuito in modo massiccio.