运行OpenCV可执行文件时出现退出码0xC0000139问题求助
运行CLion+OpenCV编译的程序时出现退出码-1073741511(0xC0000139)的问题
错误现象
程序编译成功,但运行时提示:
Process finished with exit code -1073741511 (0xC0000139)
这个错误码对应动态链接库(DLL)加载失败,通常是缺失依赖DLL或版本不匹配导致。
代码实现
#include "opencv2/video/tracking.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/videoio.hpp" #include "opencv2/highgui.hpp" #include <iostream> #include <ctype.h> using namespace cv; using namespace std; static void help() { // print a welcome message, and the OpenCV version cout << "\nThis is a demo of Lukas-Kanade optical flow lkdemo(),\n" "Using OpenCV version " << CV_VERSION << endl; cout << "\nIt uses camera by default, but you can provide a path to video as an argument.\n"; cout << "\nHot keys: \n" "\tESC - quit the program\n" "\tr - auto-initialize tracking\n" "\tc - delete all the points\n" "\tn - switch the \"night\" mode on/off\n" "To add/remove a feature point click it\n" << endl; } Point2f point; bool addRemovePt = false; static void onMouse( int event, int x, int y, int /*flags*/, void* /*param*/ ) { if( event == EVENT_LBUTTONDOWN ) { point = Point2f((float)x, (float)y); addRemovePt = true; } } int main( int argc, char** argv ) { VideoCapture cap; TermCriteria termcrit(TermCriteria::COUNT|TermCriteria::EPS,20,0.03); Size subPixWinSize(10,10), winSize(31,31); const int MAX_COUNT = 500; bool needToInit = false; bool nightMode = false; help(); cv::CommandLineParser parser(argc, argv, "{@input|0|}"); string input = parser.get<string>("@input"); if( input.size() == 1 && isdigit(input[0]) ) cap.open(input[0] - '0'); else cap.open(input); if( !cap.isOpened() ) { cout << "Could not initialize capturing...\n"; return 0; } namedWindow( "LK Demo", 1 ); setMouseCallback( "LK Demo", onMouse, 0 ); Mat gray, prevGray, image, frame; vector<Point2f> points[2]; for(;;) { cap >> frame; if( frame.empty() ) break; frame.copyTo(image); cvtColor(image, gray, COLOR_BGR2GRAY); if( nightMode ) image = Scalar::all(0); if( needToInit ) { // automatic initialization goodFeaturesToTrack(gray, points[1], MAX_COUNT, 0.01, 10, Mat(), 3, 3, 0, 0.04); cornerSubPix(gray, points[1], subPixWinSize, Size(-1,-1), termcrit); addRemovePt = false; } else if( !points[0].empty() ) { vector<uchar> status; vector<float> err; if(prevGray.empty()) gray.copyTo(prevGray); calcOpticalFlowPyrLK(prevGray, gray, points[0], points[1], status, err, winSize, 3, termcrit, 0, 0.001); size_t i, k; for( i = k = 0; i < points[1].size(); i++ ) { if( addRemovePt ) { if( norm(point - points[1][i]) <= 5 ) { addRemovePt = false; continue; } } if( !status[i] ) continue; points[1][k++] = points[1][i]; circle( image, points[1][i], 3, Scalar(0,255,0), -1, 8); } points[1].resize(k); } if( addRemovePt && points[1].size() < (size_t)MAX_COUNT ) { vector<Point2f> tmp; tmp.push_back(point); cornerSubPix( gray, tmp, winSize, Size(-1,-1), termcrit); points[1].push_back(tmp[0]); addRemovePt = false; } needToInit = false; imshow("LK Demo", image); char c = (char)waitKey(10); if( c == 27 ) break; switch( c ) { case 'r': needToInit = true; break; case 'c': points[0].clear(); points[1].clear(); break; case 'n': nightMode = !nightMode; break; } std::swap(points[1], points[0]); cv::swap(prevGray, gray); } return 0; }
CMakeLists.txt配置
cmake_minimum_required(VERSION 3.25) project(Opencv) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++23") set(CMAKE_AUTOMOC OFF) set(CMAKE_AUTOUIC OFF) set(CMAKE_AUTOURCC OFF) # Where to find CMake modules and OpenCV set(OpenCV_DIR "E:/Software/opencv/Mingw-build/install") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) set(CMAKE_PREFIX_PATH "E:/Software/Qt/6.5.2/mingw_64") find_package(Qt6 REQUIRED COMPONENTS Widgets Core Gui) add_executable(Opencv "main.cpp") # add libs you need set(OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui opencv_video opencv_imgcodecs) # linking target_link_libraries(Opencv ${OpenCV_LIBS} Qt6::Widgets Qt6::Core Qt6::Gui)
原因分析与解决方法
核心原因
退出码0xC0000139的本质是程序无法找到或加载依赖的动态链接库,常见场景包括:
- OpenCV/Qt的DLL未部署到程序可访问路径
- 编译OpenCV/Qt的编译器版本与CLion使用的MinGW版本不一致
- 手动指定的OpenCV链接库不全,导致运行时缺失依赖
具体解决步骤
部署OpenCV DLL
- 找到OpenCV安装目录下的
bin文件夹(比如E:/Software/opencv/Mingw-build/install/bin) - 将对应版本的DLL复制到程序输出目录(
C:\Users\ahoiz\CLionProjects\Opencv\cmake-build-debug),注意区分debug(文件名带d,如opencv_core4xxd.dll)和release版本 - 或者将该
bin目录添加到系统环境变量PATH中,重启CLion后生效
- 找到OpenCV安装目录下的
部署Qt DLL
- 将Qt的MinGW版本
bin目录(E:/Software/Qt/6.5.2/mingw_64/bin)添加到系统PATH - 或者复制该目录下的
Qt6Widgets.dll、Qt6Core.dll、Qt6Gui.dll(debug版带d)到程序输出目录
- 将Qt的MinGW版本
确保编译器版本一致
- 确认OpenCV是用与CLion相同版本的MinGW编译的,不能混用MSVC编译的OpenCV和MinGW项目,版本不匹配会导致DLL加载失败
修正CMakeLists.txt
- 移除手动设置的
OpenCV_LIBS行,因为find_package(OpenCV REQUIRED)会自动收集所有依赖库,手动指定容易遗漏模块(比如代码用到的videoio模块) - 修改链接部分为:
target_link_libraries(Opencv ${OpenCV_LIBS} Qt6::Widgets Qt6::Core Qt6::Gui)
- 移除手动设置的
调试步骤与工具
- Dependency Walker:直接打开程序的exe文件,工具会列出所有依赖的DLL,并标记缺失的文件,精准定位问题
- CLion调试模式:启动调试,查看控制台输出,部分情况下会直接提示缺失的DLL名称
- 环境变量检查:打开命令提示符,输入
echo %PATH%,确认OpenCV和Qt的bin目录已加入,且没有其他版本的同名DLL干扰
内容的提问来源于stack exchange,提问作者SteveAhoy
相关产品推荐
相关产品推荐

