个人音乐分享网站源码,金华网站制作,北京的广告公司网站建设,wordpress 滑块插件无论是C调用Rust动态库还是Rust调用C动态库#xff0c;其操作基本都是一样地简单#xff0c;基本和C调用C的动态库没什么区别#xff0c;只需要列出所需要导入的函数#xff0c;并链接到相应的lib文件即可。
这里#xff0c;在windows中#xff0c;我们以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 iostreamextern C int foo3(int);int main()
{std::cout Hello World!\n foo3(101);
}同时设置链接属性到externtest.dll.lib配置属性-链接器-输入-附加依赖项 。 编译后就可以直接运行了而且如果你单步运行的话vs2019可以直接进入rust的源码中。 2Rust调用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(nameDynamicLib1, kindstatic)]
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。
本文结束