剛入坑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...