OpenCV加载已卸载CUDA 9.1 DLL报错,当前安装CUDA 8.0
解决CUDA版本切换后OpenCV依赖旧版DLL的问题
我刚碰到过几乎一模一样的情况,核心问题其实是你之前用的OpenCV是基于CUDA 9.1编译的,程序的二进制文件已经硬编码绑定了CUDA 9.1的动态库依赖,单纯换CUDA环境、改PATH根本改不了这个编译时的绑定。下面给你分步拆解解决办法:
问题本质
你的测试程序和OpenCV库本身,在编译阶段就已经和CUDA 9.1的cudart64_91.dll等库建立了依赖关系。哪怕你卸载了CUDA 9.1,运行时系统还是会按照编译时记录的依赖去寻找旧版本DLL,自然会报错。
具体解决方案
1. 先彻底清理并调整系统PATH
- 右键「此电脑」→ 属性 → 高级系统设置 → 环境变量,找到系统变量里的
Path:- 删掉所有和CUDA 9.1相关的路径(比如
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\bin) - 把CUDA 8.0的
bin路径(默认是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin)拖到Path列表最顶端,确保Windows优先找新版本的DLL
- 删掉所有和CUDA 9.1相关的路径(比如
- 一定要重启电脑,PATH修改后必须重启才能完全生效,不然系统可能还缓存着旧路径
2. 重新编译适配CUDA 8.0的OpenCV
这是最彻底的解决办法——只有重新编译OpenCV,才能让它绑定CUDA 8.0的依赖库:
- 下载和你之前用的版本一致的OpenCV源码(避免API兼容问题)
- 打开CMake,设置好OpenCV源码路径和编译输出路径
- 在CMake配置界面:
- 勾选
WITH_CUDA选项 - 指定
CUDA_TOOLKIT_ROOT_DIR为你的CUDA 8.0安装路径(比如C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0) - 按需调整其他编译选项(比如是否要编译contrib模块)
- 勾选
- 点击
Configure,选择Visual Studio 2013 Win64作为生成器,等配置完成 - 配置无误后点击
Generate,生成VS2013工程文件 - 打开生成的工程,编译
INSTALL目标(Debug和Release版本都要编译),完成后新的OpenCV就会绑定CUDA 8.0的库了
3. 更新VS项目的依赖配置
打开你的测试项目,在VS2013的属性里做这些修改:
- VC++目录:
- 包含目录:替换为CUDA 8.0的
include路径(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include)和新编译的OpenCV的include路径 - 库目录:替换为CUDA 8.0的
lib\x64路径(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64)和新编译的OpenCV的lib路径
- 包含目录:替换为CUDA 8.0的
- 链接器 → 输入:
- 附加依赖项:确保引用的是CUDA 8.0的库(比如
cudart.lib)和新编译的OpenCV库(比如opencv_world3xx.lib),删掉所有和CUDA 9.1相关的依赖
- 附加依赖项:确保引用的是CUDA 8.0的库(比如
4. 清理Windows的DLL缓存
Windows会缓存DLL的查找路径,可能导致即使PATH改了还是找旧文件:
- 以管理员身份打开命令提示符,运行:
rundll32.exe advapi32.dll,ProcessIdleTasks,触发系统清理缓存 - 或者打开「磁盘清理」工具,勾选「系统错误内存转储文件」和「临时文件」,清理缓存文件
你的测试代码与报错信息
测试代码
#include <iostream> #include "opencv2/opencv.hpp" #include "opencv2/core.hpp" #include "opencv2/highgui.hpp" #include "opencv2/cudaarithm.hpp" using namespace cv; int main(int argc, char* argv[]) { try { cv::Mat src_host = cv::imread("hdd.png", cv::IMREAD_GRAYSCALE); cv::cuda::GpuMat dst, src; src.upload(src_host); cv::cuda::threshold(src, dst, 128.0, 255.0, cv::THRESH_BINARY); cv::Mat result_host(dst); cv::namedWindow("Result", cv::WINDOW_NORMAL); cv::imshow("Result", result_host); cv::waitKey(); } catch (const cv::Exception& ex) { std::cout << "Error: " << ex.what() << std::endl; } return 0; }
报错信息
无法继续执行代码,因为找不到cudart64_91.dll。重新安装程序可能会解决此问题。
内容的提问来源于stack exchange,提问作者Schütze
相关产品推荐
相关产品推荐

