OpenCV调用namedWindow报函数未实现 安装GTK重编译仍报错
OpenCV调用namedWindow报函数未实现异常解决方法
问题背景
运行基于OpenCV 4.1.0开发的C++程序时触发崩溃,抛出cv::Exception异常,错误信息如下:
terminate called after throwing an instance of 'cv::Exception' what(): OpenCV(4.1.0) /home/me/opencv/modules/highgui/src/window.cpp:610: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'
已按错误提示安装依赖:
sudo apt-get install libgtk2.0-dev pkg-config -y
重新执行项目cmake编译流程后错误仍复现。代码已引入必要头文件:
#include <iostream> #include <cstdio> #include <iomanip> #include <opencv2/opencv.hpp> #include <opencv2/videoio.hpp> #include <opencv2/highgui.hpp>
触发错误的代码行:
cv::namedWindow("input video", cv::WINDOW_NORMAL);
根因说明
错误的核心原因是当前程序链接的OpenCV库在编译阶段没有检测到GTK开发依赖,highgui模块的UI交互函数没有被编译入库。仅在系统中安装GTK依赖不会修改已经编译完成的OpenCV二进制文件,因此直接重编自己的项目无法解决问题。
解决步骤
- 清理OpenCV编译缓存
之前执行OpenCV cmake配置时系统未安装GTK依赖,cmake已经将WITH_GTK=OFF的结果写入缓存,不清理缓存的话后续安装依赖也不会更新配置。进入OpenCV源码对应的build编译目录,执行命令清空所有旧配置和编译产物:
注意:该命令仅在OpenCV专属的build目录下执行,不要在其他系统目录或个人项目目录运行,避免误删文件。rm -rf * - 重新配置OpenCV编译选项
在清理完成的build目录下重新执行cmake配置:
配置完成后检查输出日志中cmake ..GUI段落的信息,必须出现GTK+ 2.x: YES的标识,才代表GTK依赖被正确识别。如果仍显示NO,补充安装GTK3兼容依赖后重新执行cmake配置:sudo apt install libgtk-3-dev -y - 重新编译安装OpenCV
确认GTK配置为YES后,执行编译、安装、动态库刷新命令:make -j$(nproc) sudo make install sudo ldconfig-j$(nproc)参数会自动匹配CPU核心数并行编译,加快编译速度。 - 重新构建自己的项目
回到个人C++项目的构建目录,删除旧的cmake缓存和编译产物,重新执行cmake、make流程编译程序,运行后即可解决报错。
额外排查项
如果上述步骤执行完成后仍报错,逐一检查以下问题:
- 确认项目链接的是刚编译安装的4.1.0版本OpenCV,而非系统apt源预装的无GTK版本OpenCV。可以在项目CMakeLists.txt中加入
message(STATUS "Linked OpenCV version: ${OpenCV_VERSION}"),配置时打印链接的OpenCV版本做比对。 - 如果程序运行在无桌面环境的纯命令行服务器上,系统本身没有GTK运行支撑,不需要修复UI功能,直接删除所有
cv::namedWindow、cv::imshow等UI相关代码即可,这类接口在无桌面环境下本身无法正常运行。
内容的提问来源于stack exchange,提问作者mchd
相关产品推荐
相关产品推荐

