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

编译darknet报Error139致convolutional_kernels.o构建失败如何解决

Darknet 编译报 Error 139(段错误)排查解决

编译时控制台输出报错如下:

Makefile:182: recipe for target 'obj/convolutional_kernels.o' failed
make: *** [obj/convolutional_kernels.o] Error 139

该错误本质是编译流程中生成obj/convolutional_kernels.o目标文件时,调用的编译程序触发了内存段错误,make进程捕获到程序崩溃信号后返回139错误码,可按以下优先级逐一排查:

  • 优先检查Makefile中GPU架构(ARCH)配置不匹配问题
    这是该报错最高发的诱因。多数用户直接复用网上旧版Makefile的ARCH配置,填写的CUDA算力值和本地NVIDIA显卡实际算力不匹配,会导致nvcc编译对应架构的核函数代码时直接崩溃。
    解决方法:确认本地显卡对应的CUDA算力值,注释掉Makefile里所有和本地显卡算力不匹配的ARCH配置行,仅保留匹配的配置项,修改完成后先执行make clean清除旧的编译缓存,再重新发起编译。
  • 检查CUDA与GCC版本适配问题
    不同版本的CUDA对宿主编译器GCC有明确的版本上限要求,比如CUDA 11.x最高支持GCC 10,CUDA 12.x最高支持GCC 12,如果本地默认GCC版本超出CUDA支持的上限,nvcc调用GCC处理代码时就会触发段错误。
    排查方法:分别执行nvcc --version、gcc --version查看两个组件的版本,如果版本不匹配,要么安装适配版本的GCC并通过软链接切换为系统默认GCC,要么在Makefile中添加NVCCFLAGS += -ccbin 适配版本GCC的绝对路径,指定nvcc调用符合版本要求的编译器。
  • 检查编译时内存不足问题
    编译CUDA核函数时单编译线程内存占用很高,如果编译时加了-j多线程参数,在内存小于8G且未配置swap分区的机器上,很容易触发系统OOM杀掉编译进程,进程被异常杀死时也会返回139错误码。
    解决方法:清除系统缓存后直接执行单线程make编译,不要加-j多线程参数;如果单线程编译依然报内存不足,给系统添加至少4G的swap分区后再重试。
  • 排查CUDA安装损坏问题
    如果以上配置都确认无误,写一个最简单的CUDA Hello World测试程序调用nvcc编译,如果连测试程序编译都报段错误,说明本地CUDA安装包损坏、或者安装后目录权限被错误修改,卸载现有CUDA后重新安装对应版本即可,重装后不要随意修改/usr/local/cuda目录的用户权限。

调试技巧:把Makefile中的DEBUG=1配置打开,重新编译时会打印完整的执行日志和崩溃栈,能快速定位具体是哪个编译环节触发的崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:39:58