You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows环境下Zig交叉编译riscv64-linux-musl失败求助

在Windows环境下用GitHub Actions交叉编译RISC-V ELF二进制的链接错误问题

问题描述

我通过GitHub Actions在windows-latest环境下,使用Zig工具链交叉编译生成RISC-V 64位ELF二进制文件。这套配置在Linux和macOS平台能正常工作,但在Windows环境下执行链接步骤时失败。

核心配置

GitHub Actions工作流关键片段:

build:
  runs-on: windows-latest
  env:
    CC: zig cc -target riscv64-linux-musl
    CXX: zig c++ -target riscv64-linux-musl
  ...
  - name: Build all examples
    working-directory: ${{github.workspace}}
    run: |
      export PATH=$PWD/zig-windows-x86_64-0.14.0-dev.2441+3670910f2:$PATH
      cmake -G Ninja -B build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSTRIPPED=ON -DCMAKE_TOOLCHAIN_FILE=cmake/zig-toolchain.cmake -DCMAKE_C_COMPILER="${{env.CC}}" -DCMAKE_CXX_COMPILER="${{env.CXX}}"
      cmake --build build --parallel 8
    shell: bash

CMake工具链文件内容:

set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR "riscv64")
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
set(CMAKE_C_COMPILER "zig" cc -target riscv64-linux-musl)
set(CMAKE_CXX_COMPILER "zig" c++ -target riscv64-linux-musl)

错误详情

编译过程无异常,但首次链接可执行文件时报错:

[146/181] Linking CXX executable bin\asm
FAILED: bin/asm 
C:\Windows\system32\cmd.exe /C "cd . && D:\a\godot-sandbox-programs\godot-sandbox-programs\zig-windows-x86_64-0.14.0-dev.2441+3670910f2\zig.exe c++ -target riscv64-linux-musl -O3 -DNDEBUG -s -Xlinker --dependency-file -Xlinker programs\asm\CMakeFiles\asm.dir\link.d programs/asm/CMakeFiles/asm.dir/main.cpp.o programs/asm/CMakeFiles/asm.dir/extra/obstack.c.o -o bin\asm  -Wl,--whole-archive  _deps/godot-sandbox-build/libsandbox_api.a  -Wl,--no-whole-archive  -static  D:/a/godot-sandbox-programs/godot-sandbox-programs/programs/asm/zig-libRiscvAsmLib.a  -Wl,--image-base=0x100000  _deps/zlib-build/libz.a && cd ."
error: unsupported linker arg: --dependency-file

问题根源

问题本质是Windows环境下的CMake+Ninja组合会默认向链接器传递--dependency-file参数,但Zig的RISC-V交叉链接器(基于LLVM)并不支持该参数。

在Linux和macOS平台,CMake会针对GNU链接器的行为处理依赖文件生成,不会传递该参数给交叉链接器;但Windows下的CMake逻辑存在差异,错误地将这个参数传递给了Zig工具链,导致链接失败。

解决/规避方案

方案1:禁用链接阶段的依赖文件生成

在CMake配置中添加参数,阻止Ninja为链接目标生成依赖文件:

  • 直接修改zig-toolchain.cmake,添加以下两行:
set(CMAKE_LINK_DEPENDS_NO_SHARED ON)
set(CMAKE_LINK_DEPENDS_NO_EXECUTABLE ON)
  • 或者在CMake命令行通过-D参数传递:
cmake -G Ninja -B build ... -DCMAKE_LINK_DEPENDS_NO_EXECUTABLE=ON -DCMAKE_LINK_DEPENDS_NO_SHARED=ON

方案2:显式指定Zig的LLD链接器

绕过CMake默认的链接命令模板,直接使用Zig提供的ld.lld链接器,避免传递不兼容参数。修改zig-toolchain.cmake:

set(CMAKE_LINKER "zig ld.lld -target riscv64-linux-musl")
set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_LINKER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")

方案3:升级Zig版本

该问题可能是Zig 0.14 nightly版本的临时兼容性bug,尝试更新到更近期的nightly版本,或等待0.14正式版发布,看是否修复了Windows平台交叉链接的参数兼容问题。


内容的提问来源于stack exchange,提问作者gonzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:22:33