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
相关产品推荐
相关产品推荐

