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

发布于 2022-09-05 20:30:24 字数 401 浏览 26 评论 0

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

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

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


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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

塔塔猫 2022-09-12 20:30:24

想了一下,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,避免每次都重新生成

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文