[Rust笔记] 【运行时】FFI 链接 C ABI 动态链接库(实操分享)

上网导航 2023-10-19 138 0条评论
摘要: 【运行时】FFI链接C ABI动态链接库(实操分享)不需要依赖任何第三方crate就可达成·运行时·链接的功...

环境变量$RUSTFLAGS会将【编译器配置指令-L】传递给rustc核心和向Library Search Path清单临时添加一个新检索目录。

【重点强调】我已亲测:在.cargo\config.toml [build] rustflags = "***"配置项内,设置此-L编译器参数不管用 — 原因不详且和Cargo Book文档描述不符。

接着,若你的目标仅只是cargo build编译出一个.exe可执行文件,那么到这就可以打住了。

再续,若你的目标是cargo run既编译源码又运行可执行文件,那么还有一步需要被完成。即,使【C ABI动态链接库】对编译输出的.exe文件可见。否则,在应用程序启动过程中,会遇到(exit code: 0xc0000135, STATUS_DLL_NOT_FOUND)的错误和程序崩溃退出。其支持两种作法:

最后,执行cargo run命令,完成:

显示出GUI主界面。

在我的业务场景下,该应用程序是一个Win32 GUI App— 体积绝对碾压electron(比性能,算我欺负你)。

三方crate可带来的好处

相比于直接写extern {...}块的简单粗暴,使用第三方crate(比如,dlopen)可带来的优势有两点:

遗憾·待续

运行时【动态链接】是将【依赖项】置于.exe文件之外的。若遇到链接库文件丢失的情况,应用程序就不能正常运行了。

所以,我的下一个目标就是:在编译时,将【静态链接库.a文件】直接编译入.exe可执行文件内,来避免dll文件意外丢失的问题(当然,.exe文件的体积也会更大些)。但是,我正遇到了一个mingw64的编译错误undefined reference to 'BCryptGenRandom'还未搞定。若你对此也有兴趣,请待我的后续更新...

文章版权及转载声明:

作者:上网导航本文地址:https://www.90xe.com/post/6261.html发布于 2023-10-19
文章转载或复制请以超链接形式并注明出处技术导航

分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏