2015-02-21 15 views
12

Tôi hiện đang cố gắng viết thư viện động với Rust sẽ được tải từ một chương trình hiện có. Tôi cần xuất một vài chức năng với tên cụ thể và quy ước gọi điện. Mọi thứ hoạt động, nhưng ngay sau khi tôi use bất cứ điều gì từ các thư viện chuẩn:Tại sao Rust xuất toàn bộ thư viện chuẩn của nó khi xây dựng một DLL?

  • Các bong bóng kích thước DLL đến hơn 3MiB (Không hẳn xinh đẹp, nhưng tôi có thể sống với điều đó)
  • Toàn bộ thư viện chuẩn bị xuất khẩu từ DLL. Dưới đây là danh sách có tất cả các xuất: http://pastebin.com/LsG1u96C (5100 chức năng)

Tôi có thiếu một số công tắc trình biên dịch không? tôi biên dịch đoạn mã sau với rustc mà không cần bất kỳ tùy chọn:

#![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à chức năng duy nhất mà nên được xuất khẩu.

Đây là trên một máy Windows 8.1 với rustc 1.0.0-nightly (522d09dfe 2015-02-19) (x86)

Cập nhật: Dường như khi soạn thảo một tập tin tự động liên kết với rustc -C prefer-dynamic, kích thước DLL co lại để 60kiB và chỉ có 3 xuất khẩu thêm (http://pastebin.com/G0AYZrpF) mà tất cả trông khá hợp lý. Nhưng tôi vẫn thích một thư viện liên kết tĩnh.

+0

Việc biên dịch với tối ưu hóa ('rustc -O',' cargo build --release') có ảnh hưởng gì không? Lưu ý rằng hàng hóa đặt các tệp nhị phân phát hành/không phát hành trong các thư mục khác nhau. – Shepmaster

+1

Biên dịch với tối ưu hóa chỉ co lại thư viện bằng một vài kiB, nhưng không có hiệu ứng khác, điều tương tự cũng xảy ra với việc xây dựng bản phát hành hàng hóa. Nhưng việc biên dịch với '-C prefer-dynamic' có hiệu lực, vui lòng xem bài đăng cập nhật của tôi. – dbeinder

+0

Làm '-C lto' hoặc' -C link-args = - gc-sections' có làm gì không? Tôi không có ý tưởng bản thân mình, chỉ cần chucking nó ra khỏi đó. –

Trả lời

2

Gần đây, loại thùng mới "cdylib" đã được thêm vào có khả năng phù hợp hơn với trường hợp sử dụng của bạn. Thay thế dòng đầu tiên của tệp nguồn của bạn bằng:

#![crate_type = "cdylib"] 

Để biết thêm chi tiết, hãy xem Rust pull request #33553.

Trong thử nghiệm của tôi, nó giảm kích thước của một đơn giản "Hello World" DLL từ 650k (dylib) xuống còn 8k (cdylib). Ngoài ra số lượng các biểu tượng xuất khẩu được giảm ồ ạt.

Các vấn đề liên quan