C语言和Rust语言的互相调用(2)(Rust调用C)

本文介绍如何通过Rust构建脚本调用C语言函数,并实现两个简单的数学运算。主要内容包括创建项目、编辑构建脚本、配置依赖项、编写C语言函数及Rust主函数等。
1.创建项目

rust调用c方式挺多的,这里采用最通俗易懂的方法,用构建脚本进行构建整个项目。

cargo new rust-to-c
2.编辑build.rs的内容
extern crate cc;

fn main() {
    cc::Build::new().file("src/double.c").compile("libdouble.a");
    cc::Build::new().file("src/third.c").compile("libthird.a");
}

这里的build.rs:若要创建构建脚本,我们只需在项目的根目录下添加一个 build.rs 文件即可。这样一来, Cargo 就会先编译和执行该构建脚本,然后再去构建整个项目。
导入rust的一个库叫cc,作用肯定就是和c语言调用相关啦,关于具体细节暂时可以不学。
src/double.c和src/third.c都是一会要写的两个c语言文件,指定好他们编译之后的静态库。

3.编辑Cargo.toml的内容
[package]
name = "rust-to-c"
version = "0.1.0"
build = "build.rs"

[dependencies]
libc = "0.2"

[build-dependencies]
cc = "1.0"

package这个地方需要添加上整个构建文件build.rs以告知需要提前构建。
build-dependencies就是关于build.rs需要的库。
dependencies是main.rs所需要的库。

4.两个C语言函数的编辑

double.c

int double_input(int input)
{
    return input * 2;
}

third.c

int third_input(int input)
{
    return input * 3;
}
5.编写rust主函数的内容
extern crate libc;

extern "C" {
    fn double_input(input: libc::c_int) -> libc::c_int;
    fn third_input(input: libc::c_int) -> libc::c_int;
}

fn main() {
    let input = 4;
    let output = unsafe { double_input(input) };
    let output2: i32 = unsafe { third_input(input) };
    println!("{} * 3 = {}", input, output2);
    println!("{} * 2 = {}", input, output);
}

为了在rust代码中和c代码一样的类型定义一致,这里使用了为rust准备的libc库,可以放心使用,不用管两者的类型不一致问题。
也要提前使用extern “C”来做一个声明,链接主要就是靠它来做一个类似的接口,extern告知Rust编译器这部分功能由一个外部库提供。
unsafe的作用:rust只能保证自己的代码是安全的,c语言的代码不会给你去做检查,不加unsafe是不行的,涉及到很多底层的操作。

6.准备就绪,运行

当上面操作都做完之后,就可以运行了,你可以cargo build之后去执行那个target/debug里面的可执行文件。生成的文件和package的name保持一致。
当然我们也可以直接cargo run来看到结果。

RustC语言的相互调用过程中,指针是一个重要的概念。Rust是一种较新的系统级编程语言,具备了内存安全高性能的特性,而C语言作为一种传统的系统性语言,其指针的概念在Rust中也可以得到支持使用。 在Rust中,可以使用`ffi`(Foreign Function Interface)功能来与C语言进行交互。这使得Rust可以使用C语言函数数据结构。在C语言中,指针用于引用内存中的数据地址。而在Rust中,由于其内存管理的安全性,需要使用特定的语法关键字来操作使用指针。 在Rust中,使用`&``*`两个符号来进行指针操作。使用`&`可以创建一个指向某个值的引用,并且由Rust自动处理内存的管理。而使用`*`可以通过解引用操作符来取得指针所指向的值。 当Rust与C语言进行相互调用时,指针在两者之间的传递非常重要。在Rust调用C函数时,需要通过`*const`或`*mut`等类型来声明指针。同时,通过`unsafe`关键字来告诉编译器这是一个不安全的操作,需要手动去管理指针所指向的内存。 在C调用Rust函数时,需要考虑Rust的所有权(ownership)机制。Rust的所有权机制确保了内存的安全有效的内存管理。当C语言调用Rust函数时,需要传递指针给Rust函数,并在合适的时候将指针的所有权返回给C语言。 总之,RustC语言的相互调用中,指针是连接两者的重要桥梁。在Rust中,通过特定的语法关键字进行指针操作,并通过`ffi`功能与C语言进行交互。指针的有效管理是确保内存安全的关键所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值