使用 gtkmm 编译 gtk 程序时出错

Posted

技术标签:

【中文标题】使用 gtkmm 编译 gtk 程序时出错【英文标题】:Errors in compiling gtk program with gtkmm 【发布时间】:2016-11-25 05:10:23 【问题描述】:

我使用 glade 设计器制作了一个 GUI,并将功能封装在一个类中。这是我编写的类定义:

#ifndef _CLIPSWINDOW_H
#define _CLIPSWINDOW_H 
#include <gtkmm.h>


class ClipsWindow : public Gtk::Window

public:
    ClipsWindow(BaseObjectType * cobject, const Glib::RefPtr<Gtk::Builder> &refGlade);
    ~ClipsWindow();


protected:
    Glib::RefPtr<Gtk::Builder> builder;
    //MainWindow
    Gtk::Window *main_window;
    // Control buttons.
    Gtk::Button *agenda_btn; // buttons to contain the control buttons in the GUI.
    Gtk::Button *fact_btn;
    Gtk::Button *run_btn;
    Gtk::Button *reset_btn;
    // Menu options.
    //Gtk::MenuButton *options; // Get the options menu
    Gtk::MenuItem *load_item; // Menu items for the "Options menu"
    Gtk::MenuItem *save_item;
    Gtk::MenuItem *change_strategy_item;
    //Gtk::MenuButton *help;
    Gtk::MenuItem *about_item; // Menu item for the "Help Menu"

    // signal handlers for buttons. 
    void on_agendabtn_clicked();
    void on_factbtn_clicked();
    void on_runbtn_clicked();
    void on_resetbtn_clicked();

    // signal handlers for menu items.
    void on_load_activate();
    void on_StrategyOption_activate();
    void on_SaveOption_activate();
    void AboutItem_activate_cb(); 
;







#endif

主函数如下所示:

Gtk::Main kit(argc,argv);
    //auto app = Gtk::Application::create(argc, argv, "clipsgui.clemson.edu");
  Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("clipswindow.glade");



    ClipsWindow *cw = 0;
    builder->get_widget_derived("main_window", cw);
    kit.run(*cw);

我已经注意将底层 Cobject 传递给 Gtk::Window 的构造函数。当我尝试使用命令g++ main_app.cpp -o mainpkg-config --cflags --libs gtkmm-3.0 编译此程序时,我得到一个.pthread 文件,或者在尝试单独编译文件时,错误是`gtkmm no这样的文件或目录。但是,我通过创建一个小型驱动程序测试了 gtkmm,它编译得很好。知道我可能做错了什么吗?

谢谢。

编辑:here 是我的项目的 github 存储库。构建clipswindow.o 时出现小错误,但错误仍然存​​在。

【问题讨论】:

因为我无法重现您的错误。不完整的代码,不知道你是如何真正编译你的代码的。只能进行猜测,并在猜测时检查您对 g++ 的选择。 我已经为我的代码添加了 github repo。请看一下?你是如何编译程序的? 【参考方案1】:
CC=g++
GTK_COMPILE_FLAGS=pkg-config gtkmm-3.0 --cflags --libs


main: main_app.o clipswindow.o
    $(CC) main_app.o clipswindow.o -o main`$(GTK_COMPILE_FLAGS)`

main_app.o: main_app.cpp clipswindow.h
    $(CC)  main_app.cpp -o main.o `$(GTK_COMPILE_FLAGS)`

clipswindow.o: clipswindow.cpp clipswindow.h
    $(CC)  clipswindow.cpp  -o main.o`$(GTK_COMPILE_FLAGS)`

问题在于您的 makefile,而不是您在此处提供的代码示例。您已将 main_app.cpp 和 clipswindow.cpp 设置为输出 main.o,因此其中一个将覆盖另一个。它们与您要构建的内容不匹配。接下来你之前缺少一个空格

`$(GTK_COMPILE_FLAGS)`

这就是为什么将 pthread 附加到文件名的原因。

【讨论】:

谢谢。你说的是then ``标签之间的空格吗? 已编辑,`` 被当作引号。是在``标签之前

以上是关于使用 gtkmm 编译 gtk 程序时出错的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试编译我的程序时,GTKmm 头文件似乎丢失了

为 gtk、gtkmm 和 opencv 更正 CMakeLists.txt 文件

gtkmm 对某些 gtk::builder 函数 add_from_file 的未定义引用

“Gtk-WARNING **:无法打开显示:”在 Eclipse 中运行 gtkmm 项目时

gtkmm 3.10.1 中带有 CSS 的 Gtk::Box 样式问题

在 gtkmm3 中使用 Gtk::Assistant