Rust引用自定義c c 庫

2021-09-11 14:18:03 字數 2299 閱讀 4533

剛入坑rust,因為公司專案需求,需要將libjpeg-turbo移植到rust中,在使用ndk完成交叉編譯後,我對著幾個庫檔案不知所措。國內rust相關的文章太少,無奈只能到github和stack overflow上找答案。這篇文章的內容其實是rust ffi章節的相關知識,在這裡做一下總結。

ffi指的是 foreign function inte***ce(我理解為外部函式介面)

說白了就是rust呼叫c/c++和c/c++呼叫rust。不管是各類書籍和各類的教學文章裡都已經寫明了

他們改怎樣做,這裡我們也就不再囉嗦了。但是在編譯、構建方面,提到的內容比較少,大部分是

使用rustc命令做編譯鏈結(rustc -l /path/to/lib ***.rs)。

涉及到cargo配置的很少很少。

複製**

在cargo book的build script裡的outputs of the build script一節,教我們如何配置build.rs來達到一些目的。在我最後做了一些嘗試後,找到了在cargo管理的專案中,如何配置鏈結我們自定義的c/c++庫檔案

首先準備好我們需要鏈結的庫檔案

$ touch test.c

複製**

內容如下

#includevoid say_hello() 

複製**

非常簡單的乙個函式,接下來我們把它編譯成.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::;

fn main() ", 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());

複製**

接下來把我們準備好的庫檔案丟到src目錄下,來試試看我們的配置有沒有效果,此時目錄結構如下:

|____cargo.lock

|____cargo.toml

|____src

| |____build.rs

| |____main.rs

| |____libtest.a

複製**

開啟我們的main.rs新增一下**:

fn main() 

}#[link(name = "test", kind = "static")]

extern "c"

複製**

最後

$ cargo run

$ hello rust!

複製**

可以看到,我們c語言裡定義的函式已經被執行了!

關於自定義控制項引用自定義屬性那點事

自定義控制項相信是每個程式猿的高階必經之路,那在我們使用自定義控制項的時候,有時候會需要使用的我們自定義的屬性,這個時候怎麼辦呢?來,我們一步一步來看。首先,第一步先找到你的資源目錄,在values中建立attrs.xml檔案 第二步 建立你需要使用的自定義屬性 注意這裡有乙個declare sty...

cocoapods自定義庫

本地私有庫 1.編寫需要封裝的庫原始碼 2.使用git管理原始碼 git add git commit m 描述資訊 3.建立spec檔案 pod spec create 自定義名稱 4.修改spec檔案 到此 cocoapods本地私有庫已經製作完成。使用本地私有庫 1.建立乙個專案 2.進入專案...

C C 程式設計 使用者自定義型別

include struct vector 表示通過非const引用的方式傳遞v,這樣vector init就可以修改v指向的變數了 void vector init vector v,int s void f vector v,vector rv,vector pv using namespace...