赞
踩
无论是C++调用Rust动态库还是Rust调用C++动态库,其操作基本都是一样地简单,基本和C++调用C++的动态库没什么区别,只需要列出所需要导入的函数,并链接到相应的lib文件即可。
这里,在windows中,我们以dll动态库为例说明。
在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的源码中。
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)。
本文结束
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。