2015-02-21 4 views
12

Ich versuche gerade, eine dynamische Bibliothek mit Rust zu schreiben, die von einem vorhandenen Programm geladen wird. Ich muss ein paar Funktionen mit bestimmten Namen und Aufrufkonventionen exportieren. Alles funktioniert, aber sobald ich use etwas aus der Standardbibliothek:Warum exportiert Rust seine gesamte Standardbibliothek beim Erstellen einer DLL?

  • Die DLL Größe Ballons über 3MiB (Nicht gerade schön, aber ich könnte damit leben)
  • Die gesamte Standardbibliothek wird exportiert aus die DLL. Hier ist eine Liste mit allen Exporten: http://pastebin.com/LsG1u96C (5100 Funktionen)

Fehle ich einige Compiler-Schalter? ich kompilieren den folgenden Code mit rustc ohne Optionen:

#![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] die einzige Funktion, die exportiert werden sollen.

Dies ist auf einer Windows 8.1 Maschine mit rustc 1.0.0-nightly (522d09dfe 2015-02-19) (x86)

Update: Es sieht aus wie wenn eine dynamisch verknüpfte Datei mit rustc -C prefer-dynamic Kompilieren schrumpft die DLL Größe 60kiB und es gibt nur 3 zusätzliche Exporte (http://pastebin.com/G0AYZrpF) die alle recht vernünftig aussehen. Aber ich würde immer noch eine statisch verknüpfte Bibliothek bevorzugen.

+0

Hat die Kompilierung mit Optimierungen ('rustc -O',' cargo build --release') irgendeinen Effekt? Beachten Sie, dass Cargo Release-/Non-Release-Binärdateien in verschiedenen Verzeichnissen ablegt. – Shepmaster

+1

Das Kompilieren mit Optimierungen verkleinert die Bibliothek nur um einige kiB, hat aber keinen anderen Effekt, das gleiche passiert mit dem Cargo Release Build. Aber das Kompilieren mit '-C prefer-dynamic' wirkt sich aus, siehe meinen aktualisierten Beitrag. – dbeinder

+0

Haben '-C lto' oder' -C link-args = - gc-sections' etwas? Ich habe selbst keine Ahnung, ich schmeiße es einfach raus. –

Antwort

2

Kürzlich wurde der neue Kistentyp "cdylib" hinzugefügt, der wahrscheinlich besser zu Ihrem Anwendungsfall passt. Ersetzen Sie die erste Zeile der Quelldatei mit:

#![crate_type = "cdylib"] 

Für weitere Informationen einen Blick auf Rust pull request #33553 haben.

In meinem Test hat es die Größe einer einfachen "Hello World" DLL von 650k (Dylib) auf 8k (Cdylib) verringert. Auch die Anzahl der exportierten Symbole wird massiv reduziert.

Verwandte Themen