rust中如何将DLL打包到可执行程序中

我在rust中用libloading引入dll文件,执行一些函数

使用cargo打包成exe后,需要把exe和dll放在同一个目录下,程序才能运行

请问有什么方法在打包exe的时候,将dll包含在里面,先谢谢了


补充,通过了解,我发现可以使用 include_bytes!宏来载入文件或资源

载入的数据是&static [u8]格式的,但是Library::new(library_path).unwrap() 我查看文档,new() 需要的是AsRef<OsStr>

所以想问下,如何把&[u8]转换为可传递给Library::new()的格式

阅读 12.6k
1 个回答

想了一下,includes_bytes! 是 bytes 数据,而Library期望的是一个路径,应该没有这种操作duang的就转换过来了

或者有什么方法可以实现我问题中的需求,我还没有接触到

于是,退一步,曲线救国,把DLL加载到EXE程序,在EXE运行时把DLL动态生成出来,再调用DLL

这样只需要分发单个EXE文件,不必担心DLL丢失

includes_bytes! 在编译的过程中把静态文件注入到程序中

// 加载在编译阶段导入DLL文件到程序
const DLL_FILE: &'static [u8] = include_bytes!("PcInfo.dll");

// 运行时生成DLL文件
fn generate_dll(filename: &str, buf: &[u8]) -> io::Result<()> {

    let mut f = try!(File::create(filename));
    try!(f.write(&buf));
    Ok(())

}

// 从本地加载DLL文件
let lib = Library::new(LIBRARY_PATH).unwrap();
println!("{:?}", lib);

最好生成的时候判断有没有这个DLL,避免每次都重新生成

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进