#5847·dioxus

在 Windows 主机上运行的 Android 无法链接: 从链接器响应文件中删除反斜杠

作者: mariustz创建于 2026年9月17日更新于 2026年9月17日
标签bug

问题

在 Windows 主机上,dx serve --android / dx build --android 在链接步骤中失败。链接器参数中的每个路径都失去了反斜杠:

clang: error: no such file or directory: 'C:devdioxus-datagridtargetx86_64-linux-androidandroid-releasedepsplayground-2cbced1493db4974.playground.7c43d7eef16e4b50-cgu.0.rcgu.o'
clang: error: no such file or directory: 'C:UsersME.rustuptoolchainsstable-x86_64-pc-windows-msvclibrustlibx86_64-linux-androidliblibcompiler_builtins-7964d93d152b97aa.rlib'

原因

dx 以链接器的形式运行时,packages/cli/src/build/link.rs 将参数写入 Windows 上的命令文件,并将 @file 传递给真正的链接器:

rust
if cfg!(windows) {
    let cmd_contents: String = out_args
        .iter()
        .map(|s| format!("\"{}\"", s.to_string_lossy()))
        .join(" ");
    std::fs::write(self.windows_command_file(), cmd_contents)
    // ...
    out_args = vec![format!("@{}", self.windows_command_file().display()).into()];
}

参数被引用,但没有转义。这适合 MSVC link.exe,该命令读取使用 Windows 引用规则的响应文件。对于 Android,链接器是 NDK 的 clang(x86_64-linux-android28-clang.cmd),而 clang 使用 GNU 引用规则读取响应文件,只要目标不是 MSVC。在 GNU 规则下,双引号内的反斜杠是转义字符,因此 "C:\dev\foo.o" 变为 C:devfoo.o

内容来源: DioxusLabs/dioxus