我目前正试图用Rust编写一个动态库,它将从现有程序加载.我需要导出一些具有特定名称和调用约定的函数.一切正常,但一旦我从标准库中取出任何东西:

我是不是少了一些编译器switch ?

#![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);
}

_AddLuaState@4是唯一应该导出的函数.

这是在Windows 8.1机器上的rustc 1.0.0-nightly (522d09dfe 2015-02-19)(x86)

更新:编译带有rustc -C prefer-dynamic的动态链接文件时,DLL大小缩小到60kiB,只有3个额外的导出(http://pastebin.com/G0AYZrpF个),看起来都很合理.但我还是更喜欢静态链接的库.

推荐答案

最近添加了新的 crate 类型"cdylib",它可能更适合您的用例.将源文件的第一行替换为:

#![crate_type = "cdylib"]

当使用Cargo package manager而不是直接调用rustc update Cargo.toml来包含以下行时:

[lib]
crate-type = ["cdylib"]

更多细节请看Rust pull request #33553.

在我的测试中,它将以下简单的"Hello World" DLL的大小从650k(dylib)减少到8k(cdylib).此外,导出符号的数量也大幅减少.

#[no_mangle]
pub extern fn hello_rust() -> *const u8 {
    "Hello, world!\0".as_ptr()
}

Rust相关问答推荐

如何优化小型固定大小数组中的搜索?

我怎样才能从一个Rust 的日期中go 掉3年?

如何提高自定义迭代器的`extend`性能

在Rust中宏的表达式中提取对象

从Type::new()调用函数

对于已经被认为是未定义行为的相同数据,纯粹存在`&;[u32]`和`&;mut[u32]`吗?

如何向下转换到MyStruct并访问Arc Mutex MyStruct实现的方法?

我是否可以在Ruust中修改 struct 实例上的字符串,以使其在修改后具有相同的字符串生存期?

有没有可能让泛型Rust T总是堆分配的?

`RwLockWriteGuard_,T`不实现T实现的特征

`*mut[T]`与`*mut T`的区别

Rust并发读写引起的死锁问题

Rust:`sort_by` 多个条件,冗长的模式匹配

返回引用字符串的future

预期的整数,找到 `&{integer}`

在 Traits 函数中设置生命周期的问题

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

为什么这个值在上次使用后没有下降?

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?

在 macro_rules 中转义 $ 美元符号