___isPlatformVersionAtLeast 为 MacOSx 版本构建时出现错误

问题描述 投票:0回答:1

我正在开发一款针对Apple M芯片的AI聊天桌面应用程序。该应用程序利用嵌入模型和重新排序模型,我选择了 Rust-Bert,因为它能够有效地处理此类模型。 Rust-Bert 依赖于 tch,即 LibTorch 的 Rust 绑定。

为了增强用户体验,我想将 LibTorch 库(专门用于 MPS(金属性能着色器)后端)与应用程序捆绑在一起。这将防止用户需要单独安装 LibTorch,使应用程序更加用户友好。

但是,我无法找到 MPS 后端的 LibTorch 预编译二进制文件,这些二进制文件可以通过 Cargo build.rs 文件直接捆绑到应用程序中。我需要帮助找到合适的二进制文件或替代解决方案,以便在构建过程中将库与应用程序捆绑在一起。

这是build.rs文件

use std::env;
use dirs::home_dir;

fn main() {
    // Set the minimum macOS version to 11.0 (required for `___isPlatformVersionAtLeast`)
    // Link necessary macOS system frameworks
    println!("cargo:rustc-link-arg=-framework");
    println!("cargo:rustc-link-arg=CoreML");
    println!("cargo:rustc-link-arg=-framework");
    println!("cargo:rustc-link-arg=Foundation");
    println!("cargo:rustc-link-arg=-framework");
    println!("cargo:rustc-link-arg=CoreFoundation");

    // Optionally, specify any other necessary paths for your libraries (for example, LibTorch)
    if let Some(home_dir) = dirs::home_dir() {
        let libtorch_path = home_dir.join(".pyano").join("binaries");
        let libtorch_path_str = libtorch_path.to_str().expect("Invalid libtorch path");

        // Tell cargo to pass the library search path
        println!("cargo:rustc-link-search={}", libtorch_path_str);
        println!("cargo:rustc-link-arg=-Wl,-rpath,{}", libtorch_path_str);

        // Link your LibTorch libraries here if necessary
        println!("cargo:rustc-link-lib=dylib=torch_cpu");
        println!("cargo:rustc-link-lib=dylib=torch");
        println!("cargo:rustc-link-lib=dylib=c10");
    }
}

当我为 Arm 架构构建这个时

cargo build --target aarch64-apple-darwin

和我的.cargo/config.toml

[target.aarch64-apple-darwin]
linker = "clang"
rustflags = ["-C", "link-arg=-mmacosx-version-min=11.0"]

我在 Apple M1 芯片机器上构建项目时遇到此错误。

= note: ld: warning: ignoring duplicate libraries: '-lc++', '-lc10', '-liconv', '-ltorch', '-ltorch_cpu'
          Undefined symbols for architecture arm64:
            "___isPlatformVersionAtLeast", referenced from:
                -[CoreMLExecution predict:outputs:getOutputTensorDataFn:] in libort_sys-1d12fa9f293e09c5.rlib[55](model.mm.o)
          ld: symbol(s) not found for architecture arm64
          clang: error: linker command failed with exit code 1 (use -v to see invocation)

无论我在做什么(在删除整个 build.rs 文件后也尝试过),我都会收到此错误。 我也将 Xcode 更新到了版本 15。

macos rust rust-cargo
1个回答
0
投票

添加:

println!("cargo:rustc-link-arg=Metal");    // Link Metal for MPS
println!("cargo:rustc-link-arg=Accelerate");  // Link Accelerate for hardware acceleration

用于 MPS 后端的预编译 LibTorch 二进制文件未正式适用于非英特尔芯片,因此您可能需要从具有 MPS 支持的源代码构建 LibTorch。

做:

git clone --recursive https://github.com/pytorch/pytorch
cd pytorch

按照源文档中的PyTorch中所述安装 macOS 的依赖项。

MACOSX_DEPLOYMENT_TARGET=11.0 python3 setup.py develop

修改build.rs

if let Some(home_dir) = dirs::home_dir() {
    let libtorch_path = home_dir.join(".pyano").join("binaries"); // Change to the right path
    let libtorch_path_str = libtorch_path.to_str().expect("Invalid libtorch path");

    println!("cargo:rustc-link-search={}", libtorch_path_str); 
    println!("cargo:rustc-link-arg=-Wl,-rpath,{}", libtorch_path_str);

    println!("cargo:rustc-link-lib=dylib=torch_cpu");  // Link built libraries
    println!("cargo:rustc-link-lib=dylib=torch");
    println!("cargo:rustc-link-lib=dylib=c10");
}
© www.soinside.com 2019 - 2024. All rights reserved.