一个典型的 Target Triple 通常包含四段信息(—):Architecture(架构):如 x86_64、aarch64、wasm32。它决定了生成的机器码面向哪种 CPU 指令集。Vendor(厂商):如 unknown、pc、apple。很多时候只是历史约定,没有强语义。OS(操作系统):如 linux、windows、darwin(苹果生态)、android 等。Environment(ABI / 运行环境):这是跨平台成败的关键!比如同为 Linux 的 gnu 和 musl,它们的 C 运行时环境不同,二进制兼容性和链接策略也就截然不同。
管理你的 Target
你可以通过以下命令查看 Rust 支持的所有目标平台:
rustc --print target-list
若要为某个平台(如安卓的 ARM64)编译,首先需要安装对应的标准库支持:
rustup target add aarch64-linux-android
跨平台产物:不只是 .exe 那么简单
Rust 项目并不只生成可执行文件(bin)。在跨平台开发(如移动端 SDK 或鸿蒙 Native 开发)中,理解不同的库类型尤为重要:rlib:Rust 内部依赖使用的库格式,不适合跨语言调用。staticlib(静态库,如 .a 或 .lib):非常适合嵌入到其他语言的项目中,是提供 C ABI 接口的常见选择。cdylib(动态库,如 .so、.dylib、.dll):面向 C ABI 的动态库,适合与其他语言(如 Java/Kotlin, Swift, C++)进行互操作(FFI),是 Android、iOS 和鸿蒙 Native 集成的绝对主力。你可以在 Cargo.toml 中轻松配置产物类型:
[lib]crate-type = ["cdylib", "staticlib"]
避坑指南:为什么“装了 Target”还是编译失败?
很多开发者在执行了 rustup target add xxx 后,自信满满地运行 cargo build –target xxx,却迎头撞上一堆 linker not found 的大红报错。这是跨平台编译的核心本质:Rust 的 target 组件只是必要条件,不是充分条件!当你编译目标平台的代码时,Rust 负责生成中间对象文件,但最后把这些文件“拼”成可执行文件或动态库的,是目标平台原生工具链中的链接器(Linker)。Windows往往需要 MSVC(配合 Visual Studio)或 GNU 工具链。macOS / iOS强依赖 Apple 提供的 Xcode SDK 和 Command Line Tools。Android需要配置完整的 Android NDK(包含 Clang、sysroot 等)。鸿蒙(HarmonyOS)同样需要依赖系统配套的 Native 构建工具链(如 DevEco Studio 提供的 SDK/NDK)。如果没有正确配置这些底层 C/C++ 工具链和系统库路径,链接阶段必定失败。