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

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

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

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

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

cargo new --lib externtest

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

XML 复制代码
[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的内容,

rust 复制代码
#[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的内容修改为如下,

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的内容如下,

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的内容如下,

rust 复制代码
#![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)。

本文结束

相关推荐
yi碗汤园1 天前
【一文了解】C#的StringComparison枚举
开发语言·前端·c#
Larry_Yanan1 天前
QML学习笔记(十九)QML的附加信号处理器
开发语言·笔记·qt·学习·ui
某不知名網友1 天前
I/O 多路转接之 epoll:高并发服务器的性能利器
开发语言·php
郝学胜-神的一滴1 天前
深入理解 C++ 中的 `std::bind`:功能、用法与实践
开发语言·c++·算法·软件工程
1白天的黑夜11 天前
优先级队列(堆)-1046.最后一块砖的重量-力扣(LeetCode)
c++·leetcode·优先级队列
努力学习的小廉1 天前
我爱学算法之—— 模拟(上)
c++·算法
zhangfeng11331 天前
wgcna 相关性热图中4个颜色 4个共表达模块 的模块基因是否都要做GO/KEGG分析”,核心取决于你的**研究目标和模块的生物学意义*
开发语言·r语言·生物信息
come112341 天前
Go 语言中的结构体
android·开发语言·golang
仰泳的熊猫1 天前
LeetCode:496. 下一个更大元素 I
数据结构·c++·算法·leetcode
bkspiderx1 天前
C++设计模式之行为型模式:职责链模式(Chain of Responsibility)
c++·设计模式·责任链模式