C++ 如何让OpenCV在nix中工作?
我正在尝试使用nix软件包管理器使OpenCV hello world程序正常工作,但它会抛出错误: OpenCV错误:未指定的错误(该函数未实现。使用Windows、GTK+2.x或Carbon支持重建库。如果您在Ubuntu或Debian上,请安装libgtk2.0-dev和pkg config,然后重新运行cmake或configure脚本),位于CVNamedwindoww文件/tmp/nix-build-OpenCV-2.4.13.drv-0/OpenCV-2.4.13-src/modules/highgui/src/window.cpp中,第483行 在抛出'cv::Exception'what():/tmp/nix-build-opencv-2.4.13.drv-0/opencv-2.4.13-src/modules/highgui/src/window的实例后终止调用。cpp:483:错误:(-2)未实现该函数。使用Windows、GTK+2.x或碳纤维支架重建库。如果您使用的是Ubuntu或Debian,请安装libgtk2.0-dev和pkg-config,然后在函数cvNamedWindow中重新运行cmake或configure脚本 我使用以下default.nix文件创建了一个nix shellC++ 如何让OpenCV在nix中工作?,c++,linux,opencv,nix,C++,Linux,Opencv,Nix,我正在尝试使用nix软件包管理器使OpenCV hello world程序正常工作,但它会抛出错误: OpenCV错误:未指定的错误(该函数未实现。使用Windows、GTK+2.x或Carbon支持重建库。如果您在Ubuntu或Debian上,请安装libgtk2.0-dev和pkg config,然后重新运行cmake或configure脚本),位于CVNamedwindoww文件/tmp/nix-build-OpenCV-2.4.13.drv-0/OpenCV-2.4.13-src/mod
with import <nixpkgs> {}; {
cimgEnv = stdenv.mkDerivation {
name = "cimgdev";
buildInputs = [ pkgconfig stdenv cimg xorg.libX11 boost opencv gnome.gtk ];
};
}
它可以编译,但如果我尝试运行它,就会收到前面的错误消息
我尝试了CMake,结果是一样的 第一眼看到
似乎您的OpenCV构建缺少合适的平台(主要是在highgui库中)。我从OpenCV得到这些东西
您可以看到很多GUI支持,包括前面提到的Gtk2。因此,如前所述安装ibgtk2.0-dev和pkg-config。确保_GTK变量有效。由CMake配置后,默认情况下,GTK的支持将打开。否则你可以检查一下
如果您发现任何不正确的地方,请进行编辑/评论 OpenCV是在没有GTK支持的情况下构建的。在中,
enableGtk2
默认为false
。要启用它,请重写default.nix中的参数:
让
opencvGtk=opencv.override(旧的:{enableGtk2=true;});
在里面
...
buildInputs=[…opencvGtk…];
...
无需将gtk2
或pkgconfig
之外的任何内容添加到buildInputs
中,除非您想直接使用它。
在漫长的opencv重建之后,构建并运行上述代码(给定lena.jpg
):
我不熟悉nix,但错误消息显示install libgtk2.0-dev和pkg config
,但您似乎没有在任何地方指定libgtk2.0-dev
@KenY-N-我在default.nix文件中添加了“gnome.gtk”,我认为这相当于nix包中的libgtk2.0-dev。我在default.nix文件中添加了“gnome.gtk”,我认为这相当于nix包中的libgtk2.0-dev。pkgconfig也在那里。
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main() {
Mat image;
image = imread("lena.jpg", 1);
if ( !image.data ) {
cout << "No image data" << endl;
return -1;
}
namedWindow("Display Image", WINDOW_AUTOSIZE);
imshow("Display Image", image);
waitKey(0);
return 0;
}
g++ `pkg-config --cflags opencv` opencvtest.cpp `pkg-config --libs opencv` -o opencvtest
status("")
status(" GUI: ")
if(HAVE_QT5)
status(" QT 5.x:" HAVE_QT THEN "YES (ver ${Qt5Core_VERSION_STRING})" ELSE NO)
status(" QT OpenGL support:" HAVE_QT_OPENGL THEN "YES (${Qt5OpenGL_LIBRARIES} ${Qt5OpenGL_VERSION_STRING})" ELSE NO)
elseif(HAVE_QT)
status(" QT 4.x:" HAVE_QT THEN "YES (ver ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH} ${QT_EDITION})" ELSE NO)
status(" QT OpenGL support:" HAVE_QT_OPENGL THEN "YES (${QT_QTOPENGL_LIBRARY})" ELSE NO)
else()
if(DEFINED WITH_QT)
status(" QT:" NO)
endif()
if(DEFINED WITH_WIN32UI)
status(" Win32 UI:" HAVE_WIN32UI THEN YES ELSE NO)
else()
if(APPLE)
if(WITH_CARBON)
status(" Carbon:" YES)
else()
status(" Cocoa:" YES)
endif()
else()
if(HAVE_GTK3)
status(" GTK+ 3.x:" HAVE_GTK THEN "YES (ver ${ALIASOF_gtk+-3.0_VERSION})" ELSE NO)
elseif(HAVE_GTK)
status(" GTK+ 2.x:" HAVE_GTK THEN "YES (ver ${ALIASOF_gtk+-2.0_VERSION})" ELSE NO)
else()
status(" GTK+:" NO)
endif()
status(" GThread :" HAVE_GTHREAD THEN "YES (ver ${ALIASOF_gthread-2.0_VERSION})" ELSE NO)
status(" GtkGlExt:" HAVE_GTKGLEXT THEN "YES (ver ${ALIASOF_gtkglext-1.0_VERSION})" ELSE NO)
endif()
endif()
endif()
status(" OpenGL support:" HAVE_OPENGL THEN "YES (${OPENGL_LIBRARIES})" ELSE NO)
status(" VTK support:" HAVE_VTK THEN "YES (ver ${VTK_VERSION})" ELSE NO)