【问题标题】:Gtkmm-3.0 compiled code throwing Gtk+2 symbol errorGtkmm-3.0编译代码抛出Gtk+2符号错误
【发布时间】:2014-01-22 00:52:08
【问题描述】:

我在 Ubuntu 13.10 上使用 gtkmm 3.0 开发包,编译以下代码:

#include <gtkmm.h>
#include <iostream>
#include "opencv2/opencv.hpp"
#include <chrono>
#include <thread>
#include <mutex>

//GASP! global vars!
std::mutex FRAME_MUTEX;
std::thread CV_THREAD;
cv::Mat FRAME, CLEAN;
Glib::Dispatcher dispatcher;
volatile bool THREADRUN;

void cvThread() {
    THREADRUN = true;
    cv::VideoCapture capture(0);
    while(THREADRUN) {
        FRAME_MUTEX.lock();
        capture >> FRAME;
        FRAME_MUTEX.unlock();
        dispatcher.emit();
    }
}

int main(int argc, char** argv)
{
    Gtk::Main gtkMain(argc, argv);
    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("main_window.glade");

    Gtk::Window *mainWindow;
    Gtk::Image *cleanDisplay;
    Gtk::Image *evmDisplay;

    builder->get_widget("main_window", mainWindow);
    builder->get_widget("clean_display", cleanDisplay);
    builder->get_widget("evm_display", evmDisplay);

    dispatcher.connect([&]() {
        FRAME_MUTEX.lock();
        cv::cvtColor(FRAME, CLEAN, CV_BGR2RGB);
        cleanDisplay->set(Gdk::Pixbuf::create_from_data(CLEAN.data, Gdk::COLORSPACE_RGB, false, 8, CLEAN.cols, CLEAN.rows, CLEAN.step));
        cleanDisplay->queue_draw();
        FRAME_MUTEX.unlock();
    });

    CV_THREAD = std::thread(&cvThread);
    gtkMain.run(*mainWindow);

    return 0;
}

使用命令:

$ g++ test.cpp -o uitest `pkg-config --cflags --libs gtkmm-3.0 opencv` -std=c++11

编译工作正常,但是当我运行可执行文件时,它失败并出现以下错误:

(uitest:20300): Gtk-ERROR **: GTK+ 2.x symbols detected.
Using GTK+ 2.x and GTK+ 3 in the same process is not supported
Trace/breakpoint trap (core dumped)

这是我第一次尝试使用 gtkmm,我不知道从哪里开始调试。我检查了 glade 文件,它在顶部有一个 xml 注释,表明该文件的内容需要 gtk+3。答案here 对我没有多大帮助;按照这些说明,我得到了以下输出:

-lgtkmm-3.0 -latkmm-1.6 -lgdkmm-3.0 -lgiomm-2.4 -lpangomm-1.4 -lgtk-3 -lglibmm-2.4
-lcairomm-1.0 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0
-lcairo-gobject -lpango-1.0 -lcairo -lsigc-2.0 -lgobject-2.0 -lglib-2.0
-lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann
-lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml
-lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres
-lopencv_ts -lopencv_video -lopencv_videostab 

关于如何解决此问题的任何建议?

【问题讨论】:

    标签: c++ ubuntu gtk gtkmm


    【解决方案1】:

    在 OpenCV 3 发布之前,您可以使用 Gtk::Image 或 Gdk::pixbuf 来读取/写入图像并跳过链接 highgui,这是导致问题的原因。 以下是转换 Mat 和 pixbuf 的方法:

    cv::Mat mat(cv::Size(pixbuf->get_width(),pixbuf->get_height()),
     CV_8UC3, (uchar*)pixbuf->get_pixels(), pixbuf->get_rowstride());
    

    RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_data((guint8*)mat.data,
    Gdk::COLORSPACE_RGB,false,8,mat.cols,mat.rows,mat.step);
    

    “false”参数用于透明度。

    【讨论】:

      【解决方案2】:

      OpenCV 似乎使用 gtk+2。虽然已经做出了一些努力来扩展对版本 3 的支持,但最新的情况是拉取请求尚未得到完全批准。在此之前,使用 OpenCV 时只能使用 gtk+2。

      对于那些有兴趣支持这项工作的人,请访问 github 上的the pull request page

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        相关资源
        最近更新 更多