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

