当前位置: 首页 > news >正文

Rust入门:C++和Rust动态库(dll)的相互调用

无论是C++调用Rust动态库还是Rust调用C++动态库,其操作基本都是一样地简单,基本和C++调用C++的动态库没什么区别,只需要列出所需要导入的函数,并链接到相应的lib文件即可。

这里,在windows中,我们以dll动态库为例说明。

(1) C++调用Rust生成的动态库

在Rust中,新建一个动态库,

cargo new --lib externtest

然后,修改Cargo.toml的内容如下,

[package]
name = "externtest"
version = "0.1.0"
edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies][lib]
crate-type = ["dylib"]

这里,dylib就是dynamic library的意思,然后修改src/lib.rs的内容,

#[no_mangle]
pub extern "C" fn foo3(i:i32) -> i32{i
}

 然后,通过指令

cargo build

就可以得到两个文件:externtest.dll, externtest.dll.lib,然后,在c++程序中,就可以正常调用这个库了。你可以使用MSYS2-gcc,这里我用的是vs2019。

vs2019新建一个控制台应用程序,将main.cpp的内容修改为如下,

#include <iostream>extern "C" int foo3(int);int main()
{std::cout << "Hello World!\n" << foo3(101);
}

同时,设置链接属性到externtest.dll.lib(配置属性->链接器->输入->附加依赖项 )。

编译后就可以直接运行了,而且,如果你单步运行的话,vs2019可以直接进入rust的源码中。

(2)Rust调用C++生成的动态库 

Rust调用C++动态库也同样简单,先生成一个动态库DynamicLib1.dll,其中DynamicLib1.cpp的内容如下,

extern "C" __declspec(dllexport) int32_t add(int32_t a, int32_t b) { return a + b; }

 生成DynamicLib1.dll后,我们写一个Rust程序测试一下,

cargo new rust-to-dll

然后,修改src/main.rs的内容如下,

#![allow(non_snake_case)]
#[link(name="DynamicLib1", kind="static")]
extern "C" { fn add(x: i32, y: i32) -> i32; }fn main() {// println!("Hello, world!");let x = unsafe { add(62, 30)};println!("{}", x); // 92
}

 记得把dll放到rust-to-dll的主目录下,然后就可能通过

cargo build

生成rust-to-dll.exe,用

cargo run

就能得到运行结果(92)。

本文结束

相关文章:

  • mysql数据库(下)
  • Python 装饰器decorator 圣经
  • html css 导航栏 2
  • 如何基于 esp-at 固件测试 TCP (UART 转 WiFi 透传)吞吐?
  • C语言 —— 图形打印
  • Centos8 使用编译安装nginx
  • 内网渗透-跨域环境渗透-1
  • GPT实战系列-构建多参数的自定义LangChain工具
  • vue3-admin后台管理系统: 使用Vue3+Vue-Router4 + Element-Plus打造高效后台管理系统
  • Java学习笔记15——类型转换(基本数据类型)
  • 手把手教您如何在国内免费使用GPT4接口的Bing,亲测有效!
  • 收下这份实操案例,还怕不会用Jmeter接口测试工具
  • 深入理解位运算符及其在JavaScript中的应用
  • html5cssjs代码 004 2035年倒计时
  • 揭秘2024美团春招:最全MySQL面试题大全,必看必收藏!
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • [译] 怎样写一个基础的编译器
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Android Volley源码解析
  • Consul Config 使用Git做版本控制的实现
  • ECS应用管理最佳实践
  • express如何解决request entity too large问题
  • LeetCode18.四数之和 JavaScript
  • Linux中的硬链接与软链接
  • python学习笔记-类对象的信息
  • spring security oauth2 password授权模式
  • VUE es6技巧写法(持续更新中~~~)
  • 测试如何在敏捷团队中工作?
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 复习Javascript专题(四):js中的深浅拷贝
  • 聊一聊前端的监控
  • 实现菜单下拉伸展折叠效果demo
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (转)大型网站的系统架构
  • (转)树状数组
  • .net6Api后台+uniapp导出Excel
  • .Net接口调试与案例
  • @Bean, @Component, @Configuration简析
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [Codeforces] probabilities (R1600) Part.1
  • [codevs1288] 埃及分数
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [C语言]一维数组二维数组的大小
  • [IE9] 解决了傲游、搜狗浏览器在IE9下网页截图的问题
  • [JavaWeb]—Spring入门
  • [MySQL光速入门]003 留点作业...
  • [OIDC in Action] 3. 基于OIDC(OpenID Connect)的SSO(添加Github OAuth 2.0的支持)
  • [pyqt5]pyqt5设置窗口背景图片后上面所有图片都会变成和背景图片一样
  • [Silverlight 4 RC]RichTextBox概览
  • [Spring Data MongoDB]学习笔记--MongoTemplate插入修改操作