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