码农-小林 2026-02-05 12:01 采纳率: 50.6%
浏览 1

使用cygwin64编译darknet时候到nvcc -gencode arch=compute_61,code=sm_61 提示错误

使用cygwin64编译darknet时候到nvcc -gencode arch=compute_61,code=sm_61 提示“cl: 命令行 error D8021 :无效的数值参数“/Wfatal-errors”
make: *** [Makefile:241: obj/convolutional_kernels.o] Error 2”如下图(这部换了多个compute运行还是报一样错误)

img

  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2026-02-05 12:02
    关注

    中午好🌞🌞🌞
    本答案参考通义千问

    你在使用 Cygwin64 编译 Darknet 时遇到的错误信息是:

    cl: 命令行 error D8021 :无效的数值参数“/Wfatal-errors”
    make: *** [Makefile:241: obj/convolutional_kernels.o] Error 2
    

    这个错误提示表明 nvcc 在调用 cl.exe(微软的 C/C++ 编译器)时,传递了一个不被支持的参数 /Wfatal-errors,这可能是由于 CUDA Toolkit 的版本与 Windows SDKVisual Studio 的兼容性问题引起的。


    ✅ 问题原因分析

    1. CUDA 与 Windows SDK 不兼容

    • 当你使用 CUDA Toolkit 编译 CUDA 代码时,它会调用 cl.exe(Microsoft C/C++ 编译器),而某些 CUDA 版本可能在编译过程中使用了旧版或不兼容的编译器参数。
    • 错误中的 /Wfatal-errors 是一个 MSVC(Microsoft Visual C++)编译器参数,但某些 CUDA 版本中可能不支持该参数,导致编译失败。

    2. Cygwin64 环境下的编译器路径冲突

    • Cygwin 提供了 Linux 风格的命令行环境,但它仍然依赖于 Windows 的系统库和工具链(如 cl.exe)。
    • 如果你的系统中安装了多个版本的 MSVC、CUDA 或 VS,可能会导致环境变量冲突,使得 nvcc 调用了错误的 cl.exe

    ✅ 解决方案

    🔧 步骤 1:确认 CUDA 版本与 Visual Studio 兼容性

    推荐 CUDA 版本

    • 使用 CUDA 11.x 或 12.x(较新版本对 MSVC 支持更好)
    • 确保你安装了 Visual Studio Build Tools(如 VS 2019 或 2022)

    建议:不要使用过老的 CUDA 版本(如 9.x)


    🔧 步骤 2:检查并设置正确的编译器路径

    确保 nvcc 调用的是正确版本的 cl.exe,而不是 Cygwin 中的 GNU 工具链。

    修改 Makefile 中的编译器路径(可选)

    你可以修改 Makefile 中的 NVCC 指向路径,例如:

    NVCC = /usr/local/cuda/bin/nvcc
    

    或者直接使用绝对路径。


    🔧 步骤 3:修改 Makefile 中的编译参数

    找到 Makefile 中定义 NVCCFLAGS 的部分,将以下内容进行修改:

    原始代码(可能导致错误):

    NVCCFLAGS += -Xcompiler "/wd4065" "/wd4996" "/Wfatal-errors"
    

    修改后:

    NVCCFLAGS += -Xcompiler "/wd4065" "/wd4996"
    

    重点:移除 /Wfatal-errors 参数,因为该参数在某些 MSVC 版本中不被支持。


    🔧 步骤 4:更新 CUDA 和 Visual Studio

    确保你已经安装了最新版本的:

    • CUDA Toolkit(推荐 11.8 或 12.1)
    • Visual Studio Build Tools(如 VS 2019 或 2022)
    • Windows SDK(与 Visual Studio 版本一致)

    🔧 步骤 5:使用 WSL(推荐方式)

    如果你继续遇到问题,建议改用 Windows Subsystem for Linux (WSL) 来编译 Darknet,这样可以避免 Cygwin 与 Windows 工具链的冲突。

    安装 WSL 并配置 Ubuntu:

    # 安装 WSL(如果未安装)
    wsl --install
    
    # 安装 Ubuntu
    sudo apt update && sudo apt install -y build-essential libopencv-dev python3-pip
    

    然后在 WSL 中执行 Darknet 的编译流程,会更稳定。


    ✅ 最终解决方案总结(有序列表)

    1. 确认 CUDA 版本与 Visual Studio 兼容

      • 推荐使用 CUDA 11.x 或 12.x
      • 安装 Visual Studio Build Tools(VS 2019 或 2022)
    2. 检查并设置正确的编译器路径

      • 确保 nvcc 调用的是正确的 cl.exe
      • 可以在 Makefile 中指定 NVCC 的完整路径
    3. 修改 Makefile 中的编译参数

      • 移除 /Wfatal-errors 参数

      • 示例修改如下:

        # 原始
        NVCCFLAGS += -Xcompiler "/wd4065" "/wd4996" "/Wfatal-errors"
        
        # 修改后
        NVCCFLAGS += -Xcompiler "/wd4065" "/wd4996"
        
    4. 更新 CUDA 和 Visual Studio

      • 确保所有工具链版本一致且为最新
    5. 考虑使用 WSL 替代 Cygwin

      • 更稳定的 Linux 环境,避免 Windows 工具链冲突

    ✅ 附加说明

    如果你仍然无法解决,请提供以下信息以便进一步诊断:

    • CUDA 版本(如 nvcc --version
    • Visual Studio 版本
    • Cygwin 版本
    • 完整的错误日志截图或文本

    如有需要,我可以提供一份经过优化的 Makefile 示例。欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 2月5日