一、前言
相比于C/C++,rust最方便的一个东西除了包管理之外,便是跨平台编译了。
rust提供了一系列的工具可以帮助我们非常容易的完成跨平台编译的目的。
但经过我的实际使用经验来说,你想要实现在单一的物理机上跨平台编译其它系统的程序,依旧还是困难重重。
除了使用Github提供的Action外,目前最佳的方式实际上依旧是在不同系统的物理机上使用相同的rust代码进行编译。
二、跨平台代码编写
rust核心功能库我们是无需考虑跨平台的,比如String
结构,无论最终在什么系统中编译,我们都可以直接使用。
真正需要编写跨平台代码的地方其实是需要调用特定平台api的时候,比如常见的,我们如果想要调用win api,那么就需要使用Windows这个crate。
这个crate绑定了Windows系统,也只能在Windows系统上使用,你在其它系统上使用这个crate必然会报错。
所以我们第一个需求就是,只在指定的系统上才依赖指定的crate。
其写法就是在Cargo.toml
中添加依赖时,换个写法:
[dependencies]
# 通用依赖项
serde = "1.0"
[target.'cfg(windows)'.dependencies]
# 仅在 Windows 平台上依赖 windows crate
windows = "0.53"
上面的意思就是,只在目标是Windows系统环境编译,才会去下载并依赖windows这个crate。
其它平台也类似,比如将中间的cfg(windows)
更换为cfg(linux)
或者cfg(macos)
,也分别代表linux系统与mac系统的编译选项。
有了上面的基础,下面代码中也相差不多。
比如我想写一个通用函数,而这个函数在不同的平台实现的方式并不一样。
比如我想要调用系统api打开进程,不同系统的api一般不相同。
那么此时我们就可以使用条件编译的方式:
fn main() {
#[cfg(target_os = "windows")]
println!("this is windows");
#[cfg(target_os = "macos")]
println!("this is macos");
#[cfg(target_os = "linux")]
println!("this is linux");