内容简介:刚入坑Rust,因为公司项目需求,需要将libjpeg-turbo移植到Rust中,在使用NDK完成交叉编译后,我对着几个库文件不知所措。国内Rust相关的文章太少,无奈只能到github和Stack Overflow上找答案。这篇文章的内容其实是Rust FFI章节的相关知识,在这里做一下总结。相关链接:在cargo book的Build Script里的Outputs of the Build Script一节,教我们如何配置build.rs来达到一些目的。在我最后做了一些尝试后,找到了在cargo管
刚入坑Rust,因为公司项目需求,需要将libjpeg-turbo移植到Rust中,在使用NDK完成交叉编译后,我对着几个库文件不知所措。国内Rust相关的文章太少,无奈只能到github和Stack Overflow上找答案。这篇文章的内容其实是Rust FFI章节的相关知识,在这里做一下总结。
FFI
ffi指的是 foreign function interface(我理解为外部函数接口) 说白了就是rust调用c/c++和c/c++调用rust。不管是各类书籍和各类的教学文章里都已经写明了 他们改怎样做,这里我们也就不再啰嗦了。但是在编译、构建方面,提到的内容比较少,大部分是 使用rustc命令做编译链接(rustc -L /path/to/lib xxx.rs)。 涉及到cargo配置的很少很少。 复制代码
相关链接: doc.rust-lang.org/cargo/refer…
在cargo book的Build Script里的Outputs of the Build Script一节,教我们如何配置build.rs来达到一些目的。在我最后做了一些尝试后,找到了在cargo管理的项目中,如何配置链接我们自定义的c/c++库文件
实践
首先准备好我们需要链接的库文件
$ touch test.c 复制代码
内容如下
#include<stdio.h>
void say_hello()
{
printf("Hello Rust!\n");
}
复制代码
非常简单的一个函数,接下来我们把它编译成.a的静态库
$ cc -c test.c -o test.o
$ ar -r libtest.a test.o
复制代码
接下来我们使用cargo创建一个新的Rust工程
$ cargo new link_test --bin 复制代码
这里给大家安利一下IDE,我目前在使用AndroidStudio + Rust插件。InterliJ IDEA + Rust插件应该也不错,没试过。但AndroidStudio就是基于它开发的。
编辑Cargo.toml 内容如下
[package]
name = "link_test"
version = "0.1.0"
authors = ["authors"]
edition = "2018"
build = "src/build.rs"
[build-dependencies]
dunce = "0.1.1"
复制代码
在src目录中创建build.rs (放在其他目录下也可以需要在Cargo.toml中配置)
前方高能
build.rs内容如下:
extern crate dunce;
use std::{env, path::PathBuf};
fn main() {
let library_name = "test";
let root = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());
let library_dir = dunce::canonicalize(root.join("src")).unwrap();
println!("cargo:rustc-link-lib=static={}", library_name);
println!("cargo:rustc-link-search=native={}", env::join_paths(&[library_dir]).unwrap().to_str().unwrap());
}
复制代码
主要是这两句:
println!("cargo:rustc-link-lib=static={}", library_name);
println!("cargo:rustc-link-search=native={}",env::join_paths(&[library_dir]).unwrap().to_str().unwrap());
复制代码
第一句是告诉cargo,配置rustc库文件的类型和名称,类型这里我们写的是static因为用的是静态库还有dylib和framework可以选,但是使用dylib连接动态库我一直没有成功,有搞过的大佬希望可以指点一二(使用rustc --help命令可以查看更多内容)。第二句是告诉cargo,配置rustc库文件所在的目录
接下来把我们准备好的库文件丢到src目录下,来试试看我们的配置有没有效果,此时目录结构如下:
|____Cargo.lock
|____Cargo.toml
|____src
| |____build.rs
| |____main.rs
| |____libtest.a
复制代码
打开我们的main.rs添加一下代码:
fn main() {
unsafe { say_hello(); }
}
#[link(name = "test", kind = "static")]
extern "C" {
pub fn say_hello();
}
复制代码
最后
$ cargo run
$ Hello Rust!
复制代码
可以看到,我们 c语言 里定义的函数已经被执行了!
以上所述就是小编给大家介绍的《Rust引用自定义c/c++库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Design and Analysis of Distributed Algorithms (Wiley Series on P
Nicola Santoro / Wiley-Interscience / 2006-10-27 / USD 140.95
This text is based on a simple and fully reactive computational model that allows for intuitive comprehension and logical designs. The principles and techniques presented can be applied to any distrib......一起来看看 《Design and Analysis of Distributed Algorithms (Wiley Series on P》 这本书的介绍吧!
RGB HSV 转换
RGB HSV 互转工具
HEX HSV 转换工具
HEX HSV 互换工具