编程技术记录

世界你好!

本文假设已经在macOS机器上安装了xcode
本文参考 https://www.rust-lang.org/zh-CN/

macOS 中安装 rust开发环境

安装 rust

运行下面命令

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

中途会提示用户选择哪种安装方式:1、默认安装 ;2、自定义安装 ;3、取消安装

本文选择默认安装,这将会在~/.rustup安装工具链,在~/.cargo安装包管理器。

安装完成后,可以使用 rustc --version查看版本

更新rust

rust会定期更新(6周),可使用命令rustup update进行更新

安装苹果工具链

rustup target add 指定架构工具链名称
# 例如
rustup target add  aarch64-apple-ios
  • aarch64-apple-ios , 真机arm64
  • armv7-apple-ios , 真机armv7
  • armv7s-apple-ios , 真机armv7s
  • x86_64-apple-ios, 模拟器x86_64
  • i386-apple-ios, 模拟器i386

安装VSCode 和Rust插件(本步骤可选)

建议使用VSCode + rust-analyzer扩展进行rust代码编写,详细参考https://code.visualstudio.com/docs/languages/rust

创建iOS可用的rust静态库

创建rust项目

cargo new  项目名字  --lib
# 例如 cargo new  ios_rust_hello  --lib

上面命令会创建一些文件,基本结构如下

ios_rust_hello
|___Cargo.toml  # 项目配置文件
|___src # 源代码目录
        |___lib.rs #源代码

修改配置文件,设置为静态库

修改Cargo.toml ,添加内容

[lib]
crate-type = ["staticlib"]  # 表示将构建为静态库

# 注意,如果使用下面配置,将同时生成静态库和动态库。
# 但是动态库为 dylib格式,苹果不推荐使用
# crate-type = ["staticlib","cdylib"]

更多配置参考 https://doc.rust-lang.org/cargo/reference/manifest.html

使用FFI暴露API

在rust代码中定义暴露给iOS使用的函数

#[no_mangle]
pub  extern fn print_hello() {
    println!("Hello");
}
  • #[no_mangle] ,告诉编译器,按照C风格修饰函数名
  • extern ,这个函数要导出

对应到iOS ObjC中的函数(准确说是C语言中的函数)

extern print_hello(void);

构建(指定cpu架构)

Cargo.toml尚不能配置为指定架构,需要手动使用命令指定构建

cargo build --target aarch64-apple-ios  --release

# --target cpu架构(参考本文安装苹果工具链部分)
# --release 不使用时默认构建debug版本

另外,使用rustc --print target-list 打印支持的所有cpu架构

和iOS工程集成

将已生成的rust静态库拖入xcode工程即可,或者也可以使用cocoapods管理。

发表回复

© Beli. All Rights Reserved.