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

这篇具有很好参考价值的文章主要介绍了C语言和Rust语言的互相调用(2)(Rust调用C)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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来看到结果。文章来源地址https://www.toymoban.com/news/detail-430748.html

到了这里,关于C语言和Rust语言的互相调用(2)(Rust调用C)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust图形界面:从零开始创建eGUi项目

    egui系列:初步 首先,用cargo创建一个新项目,并添加eframe 尽管默认创建的项目只实现了输出Hello world功能,但添加了eframe库,所以下载需要一点时间。 创建成功后,直接把下面的代码写入main.rs文件中,这些代码来自egui的hello_world示例。 然后运行cargo run,结果如下所示 在e

    2024年02月01日
    浏览(58)
  • 文心一言和讯飞星火全面对比测试:(一)语言理解能力

    目录 01 前言 02  测试内容设计 03  复杂语义测试 04  文章的情绪识别 05 文章的摘要总结 06  文章要素提取 07 总结         文心一言和讯飞星火是目前国内开展正式公测的两个大语言模型。很多公司都号称发布了自己的产品,但是一直没有开展大规模的公开测试。目前比

    2024年02月12日
    浏览(48)
  • KO之间互相调用

    假设有两个KO,命名为moduleA.KO,moduleB.KO,现在要实现在moduleB.KO中调用moduleA.KO中的函数。 源码: moduleA导出符号moduleA_func。 编译Makefile实现: 编译: 可以看出,moduleA_func已经在导出的符号表中了。 源码: 编译Makefile: 1、插入moduleA.ko 2、插入moduleB.ko 可以看出,moduleB成功调

    2024年02月05日
    浏览(39)
  • 你知道C语言函数调用的2种方式吗?传值调用 && 传址调用

    本篇博客会讲解C语言函数调用的2种方式,分别是:传值调用和传址调用。这2种函数调用方式有什么区别呢?为什么会有不同的效果呢?分别有哪些用途呢?下面我会一一展开。 传值调用,即通过传递变量的值来调用函数。 传址调用,即通过传递变量的地址来调用函数。 比

    2023年04月27日
    浏览(50)
  • UE和Android互相调用

    ue和android互调 这两种方式都是在UE打包的Android工程之上进行的。 一、首先是UE打包Android,勾选下面这项 如果有多个场景需要添加场景 工程文件在这个路径下 然后可以通过Android Studio打开,选择gradle打开 先运行一下,看看是否可以发布到Android设备上,然后再进行下一步。

    2024年04月26日
    浏览(34)
  • 【一起学Rust | 框架篇 | Tauri2.0框架】Tauri2.0环境搭建与项目创建

    Tauri在Rust圈内成名已久,凭借Rust的可靠性,使用系统原生的Webview构建更小的App 以及开发人员可以灵活的使用各种前端框架而一战成名。 然而,这款年轻的框架却有着大量的问题待解决,在这种情况下,他竟然还出了2.0,想要支持 安卓 和 苹果端 ,在我看来步子还是跨的挺

    2024年02月20日
    浏览(52)
  • C 语言函数完全指南:创建、调用、参数传递、返回值解析

    函数是一段代码块,只有在被调用时才会运行。 您可以将数据(称为参数)传递给函数。 函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。 事实证明,您已经知道什么是函数了 例如, main() 是一个函数,用于执行代码, printf() 也是一个函数,

    2024年02月03日
    浏览(53)
  • R语言 创建矩阵的方式

    1.以上功能实现:创建一个2行3列的矩阵;创建一个3行2列的矩阵。注意: 默认情况下,R通过依次填充列来创建矩阵。 2.以上功能实现:创建一个3行2列的矩阵。注意: byrow = TRUE选项可用于按行的顺序填充矩阵。 3.矩阵元素的提取和子矩阵的输出         4.​​​​​​​

    2024年02月11日
    浏览(28)
  • ILRuntime是如何与Unity互相调用的

    一、ILRuntime的基本介绍 ILRuntime是一个跨平台CLR实现,它可以在多个平台上运行C#代码,包括Android、iOS、Windows、Linux等等。ILRuntime的实现方式是将C#代码编译成IL代码,然后在运行时通过JIT或AOT的方式将IL代码转换为机器代码,从而实现跨平台的效果。ILRuntime的主要功能包括热更

    2024年02月16日
    浏览(48)
  • 各个微服务模块之间互相依赖调用的问题

    首先是模块之间不能够循环引用,否则会报循环依赖引入的错误。 没有了模块之间的相互依赖,在项目中这两个模块是相互调用的,分别各自定义相应的Feign接口,如下: 最开始写的运行报错的代码如下: 报错信息,如下: 报错的原因是这里定义了两个Feign接口,都是调用

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包