码农-小林 2026-04-03 13:36 采纳率: 50%
浏览 3
已结题

yolov3使用gpu编译生成darknet.exe报错

yolov3使用gpu编译生成darknet.exe报错./src/convolutional_layer.c:153:13: error: 'CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT' undeclared (first use in this function)

img


以下为makefile文件


GPU=1
CUDNN=1
OPENCV=0
OPENMP=0
DEBUG=0
CUDA_PATH=/cygdrive/c/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v11.4#2026.4
ARCH= -gencode arch=compute_30,code=sm_30 \
      -gencode arch=compute_35,code=sm_35 \
      -gencode arch=compute_50,code=[sm_50,compute_50] \
      -gencode arch=compute_52,code=[sm_52,compute_52]
#      -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated?

# This is what I use, uncomment if you know your arch and want to specify
# ARCH= -gencode arch=compute_52,code=compute_52

VPATH=./src/:./examples
SLIB=libdarknet.so
ALIB=libdarknet.a
EXEC=darknet
OBJDIR=./obj/

CC=gcc
CPP=g++
NVCC=nvcc 
AR=ar
ARFLAGS=rcs
OPTS=-Ofast
LDFLAGS= -lm -pthread 
COMMON= -Iinclude/ -Isrc/
CFLAGS=-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC

ifeq ($(OPENMP), 1) 
CFLAGS+= -fopenmp
endif

ifeq ($(DEBUG), 1) 
OPTS=-O0 -g
endif

CFLAGS+=$(OPTS)

ifeq ($(OPENCV), 1) 
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
LDFLAGS+= `pkg-config --libs opencv` -lstdc++
COMMON+= `pkg-config --cflags opencv` 
endif

ifeq ($(GPU), 1) 
#COMMON+= -DGPU -I/usr/local/cuda/include/#2026.4
COMMON+= -DGPU -I$(CUDA_PATH)/include
CFLAGS+= -DGPU
#LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand#2026.4
LDFLAGS+= -L$(CUDA_PATH)/lib -lcuda -lcudart -lcublas -lcurand
endif

ifeq ($(CUDNN), 1) 
#COMMON+= -DCUDNN 
COMMON+= -DCUDNN -I$(CUDA_PATH)/include
#CFLAGS+= -DCUDNN
CFLAGS+= -DCUDNN -I$(CUDA_PATH)/include
LDFLAGS+= -lcudnn
endif

OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o  lstm_layer.o l2norm_layer.o yolo_layer.o iseg_layer.o image_opencv.o
EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o instance-segmenter.o darknet.o
ifeq ($(GPU), 1) 
LDFLAGS+= -lstdc++ 
OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o avgpool_layer_kernels.o
endif

EXECOBJ = $(addprefix $(OBJDIR), $(EXECOBJA))
OBJS = $(addprefix $(OBJDIR), $(OBJ))
DEPS = $(wildcard src/*.h) Makefile include/darknet.h

all: obj backup results $(SLIB) $(ALIB) $(EXEC)
#all: obj  results $(SLIB) $(ALIB) $(EXEC)


$(EXEC): $(EXECOBJ) $(ALIB)
    $(CC) $(COMMON) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(ALIB)

$(ALIB): $(OBJS)
    $(AR) $(ARFLAGS) $@ $^

$(SLIB): $(OBJS)
    $(CC) $(CFLAGS) -shared $^ -o $@ $(LDFLAGS)

$(OBJDIR)%.o: %.cpp $(DEPS)
    $(CPP) $(COMMON) $(CFLAGS) -c $< -o $@

$(OBJDIR)%.o: %.c $(DEPS)
    $(CC) $(COMMON) $(CFLAGS) -c $< -o $@

$(OBJDIR)%.o: %.cu $(DEPS)
    $(NVCC) $(ARCH) $(COMMON) --compiler-options "$(CFLAGS)" -c $< -o $@

obj:
    mkdir -p obj
backup:
    mkdir -p backup
results:
    mkdir -p results

.PHONY: clean

clean:
    rm -rf $(OBJS) $(SLIB) $(ALIB) $(EXEC) $(EXECOBJ) $(OBJDIR)/*

  • 写回答

2条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2026-04-03 13:37
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 问题关键点分析

    该错误本质是cuDNN API兼容性问题,核心原因包括:
    - 枚举值拼写/版本不匹配:报错中CUDNN_CONVOLUTION_FWD_SPECIFCUDNN_CONVOLUTION_FWD_SPECIFIER的截断(代码拼写错误或旧枚举名);
    - Cuda/cuDNN版本不兼容:YOLOv3(Darknet)官方推荐Cuda 10.x + cuDNN 7.6.x,高版本cuDNN(v8+)已修改该枚举名;
    - 编译选项未正确配置:未开启CUDNN=1或cuDNN路径错误。

    2. 解决方案

    方案1:确认并修复环境兼容性(最稳妥)

    步骤1:检查Cuda/cuDNN版本匹配
    • Cuda版本:执行nvcc -V(Linux)或nvcc --version(Windows),确认为10.0/10.1/10.2
    • cuDNN版本:需对应Cuda版本(如下表):
      | Cuda版本 | 兼容cuDNN版本 |
      |----------|---------------|
      | 10.0 | 7.6.5 |
      | 10.1 | 7.6.5 |
      | 10.2 | 7.6.5/8.0.4 |
    步骤2:修改Makefile编译选项

    打开Darknet根目录的Makefile,确保以下配置:

    GPU=1          # 开启GPU支持
    CUDNN=1        # 开启cuDNN支持
    CUDNN_HALF=0   # 关闭半精度(老卡不支持)
    OPENCV=0       # 可选,需OpenCV则设为1
    # Cuda路径(Windows需改为对应安装路径)
    CUDA_PATH=/usr/local/cuda-10.1  # Linux
    # CUDNN路径(若解压到CUDA目录则无需单独设置)
    CUDNN_PATH=$(CUDA_PATH)
    
    步骤3:重新编译
    # 清理旧编译文件
    make clean
    # 重新编译
    make -j8  # 多核加速
    

    方案2:修复代码枚举拼写错误

    若环境版本匹配但仍报错,检查src/convolutional_layer.c第153行:
    - 原错误行:CUDNN_CONVOLUTION_FWD_SPECIF(截断)
    - 修改为:CUDNN_CONVOLUTION_FWD_SPECIFIER(完整枚举名)

    修改后重新编译即可。

    方案3:升级Darknet到最新分支

    若需使用高版本cuDNN(v8+),克隆Darknet最新分支:

    git clone https://github.com/AlexeyAB/darknet.git  # AlexeyAB版(更活跃)
    cd darknet
    # 按方案1修改Makefile后编译
    

    3. 各方案优缺点对比

    方案优点缺点
    环境兼容性修复官方推荐,避免后续API问题需安装旧版本cuDNN,可能需卸载新版本
    代码枚举修复快速解决,无需改环境若为版本枚举变化,可能后续出现其他错误
    升级Darknet分支支持新硬件/API,功能更全需适配新配置文件,可能破坏旧模型兼容性

    4. 总结

    1. 优先环境兼容:先确认Cuda 10.x + cuDNN 7.6.x,这是Darknet YOLOv3最稳定的组合;
    2. 代码辅助修复:若仍报错,检查枚举名拼写(补全SPECIFIER);
    3. 长期方案:若需新硬件支持,升级到AlexeyAB版Darknet。

    按上述步骤操作后,即可解决cuDNN枚举相关的编译错误。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月11日
  • 已采纳回答 4月3日
  • 创建了问题 4月3日