Gtk+ 3 使用 OpenCV 编译时出错
Gtk+ 3 Error when compiling with OpenCV
我最近在Linux上从源代码构建了OpenCV 3。我能够成功地编译和运行OpenCV程序。
然后我下载了 Gtk+ 3 和所有必需的软件包(GLib 2.52、Pango 1.40、Gdk-Pixbuf 2.36、ATK 2.24、GObject-Introspection 1.52)。我能够成功编译并运行这个简单的程序编译:
g++ -std=c++11 gtkexample.cpp `pkg-config --cflags gtk+-3.0` -o gtkexample `pkg-config --libs gtk+-3.0`
源代码:
#include <gtk-3.0/gtk/gtk.h>
int main( int argc,
char *argv[] )
{
GtkWidget *window;
GdkRGBA *color;
gtk_init (&argc, &argv);
gdk_rgba_parse(color,"(0,0,0)");
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_decorated(GTK_WINDOW (window),FALSE);
gtk_window_set_position(GTK_WINDOW (window), GTK_WIN_POS_CENTER);
gtk_widget_override_background_color(window, GTK_STATE_FLAG_NORMAL, color);
gtk_widget_show (window);
for (int i=200;i<400;i++)
gtk_window_move(GTK_WINDOW (window),i,200);
gtk_main ();
return 0;
}
成功编译后,我尝试使用Gtk+和FlyCapture相机执行我的OpenCV程序,我面临:
"Gtk-ERROR **: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported"
pkg-config --cflags gtk+-3.0
的输出为:
-pthread -I/usr/local/include/gtk-3.0 -I/usr/local/include/gio-unix-2.0/ -I/usr/local/include/cairo -I/usr/local/include/pango-1.0 -I/usr/local/include/harfbuzz -I/usr/local/include/pango-1.0 -I/usr/local/include/atk-1.0 -I/usr/local/include/cairo -I/usr/local/include/gdk-pixbuf-2.0 -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/aarch64-linux-gnu/dbus-1.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12
pkg-config --libs gtk+-3.0
的输出为:
-L/usr/local/lib -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
OpenCV程序的一个片段看起来像:
#include "FlyCapture2.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudalegacy/NCVHaarObjectDetection.hpp>
#include <opencv2/cudaobjdetect.hpp>
#include <thread>
#include <iostream>
#include <vector>
#include <gtk-3.0/gtk/gtk.h>
using namespace FlyCapture2;
int main( int argc,
char *argv[])
{
GtkWidget *window;
gtk_init (&argc, &argv); //This is where the error occurs
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_decorated(GTK_WINDOW (window),FALSE);
gtk_window_set_position(GTK_WINDOW (window), GTK_WIN_POS_CENTER);
gtk_widget_show(window);
gtk_main();
// ...
}
成功编译:
g++ -std=c++11 FlyCap2_to_MatImage.cpp `pkg-config --cflags gtk+-3.0` -I/home/nvidia/flycapture.2.11.3.121_arm64/include -I/usr/local/cuda-8.0/include -o FlyCap2_to_MatImage `pkg-config --libs gtk+-3.0` -lflycapture -lopencv_core -lopencv_highgui -lopencv_objdetect -lopencv_imgproc -lopencv_cudaobjdetect
我的问题是:
- OpenCV 3 可能使用旧版本的 GTK+ 吗?
- 我是否必须重建 OpenCV 才能配置较新版本的 Gtk+?
考虑到你在构建OpenCV之后安装了Gtk+ 3,它很可能是为了与Gtk+ 3一起工作而构建的。由于它抱怨,它表明您已经安装了一些旧版本,并且它使用它。
因此,如果你想在OpenCV中使用GUI便利功能,你需要重建OpenCV,确保它是用正确的Gtk+版本构建的。
但是,由于您提供了自己的GUI,因此似乎实际上不需要使用OpenCV的该部分。由于您已将OpenCV构建为单个模块,因此为了避免冲突,您根本无法与opencv_highgui
链接。
我有同样的问题,但在 python 中,我已经通过在 python 主文件的头部附加这两行来解决它。它将仅指定版本,当您的环境具有多个版本的 GTK 时,您需要该版本。祝你好运!
import gi
gi.require_version('Gtk', '2.0')
- 在Linux for Windows上编译C++代码时出错
- 为x86而非x64编译时出错
- 当我尝试通过 mingw 使用 CMake 和 SFML 库编译项目时出错
- 尝试在Windows上执行C++时出错(通过MinGW编译)
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- constexpr 使用 clang 编译 TensorFlow 时出错
- 从DLL导出函数,LoadLibrary()需要用TEXT转换的字符串才能编译而不会出错
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- 编译时出错 - 从 DWORD 到 LPCVOID 的转换
- 在发布模式下启动使用库的静态链接编译的应用程序时出错
- 编译时出错 - 链接.cpp和头文件
- <limits> 使用 VSC2019 编译旧代码时出错
- 在 ubuntu 焦点上编译虚幻引擎 4.25 时出错
- 编译包含LLVM API标头的C++文件时出错
- 编译以下代码时出错
- 使用交叉工具ng编译gcc时出错
- 在 dll 中为 qLibrary 编译 qobject 时出错
- 使用 cmake 在窗口上编译 c++ 数据库时出错
- 使用 TDM GCC 5.1.0 编译 PDCurses36 时出错
- Lua :在原生lua中编译,但在使用LuaJIT和sol2时C++出错