使用glade文件时无法执行构建的gtkmm程序

时间:2014-07-08 04:29:53

标签: builder gtkmm glade

当我构建一个使用(加载) .glade 文件的gtkmm应用程序时,使用 Gtk :: Builder ,然后双击应用程序(在文件资源管理器中)它将不会显示用户界面,从shell启动相同的应用程序时运行得很好并显示界面。

我还尝试在没有林间空地支持的情况下创建完全相同的应用程序,并且在文件浏览器中双击应用程序时它运行得很好(它显示了用户界面)。

使用林间空地构建应用程序或我需要做什么时,有什么技巧吗?

main.cpp的快照

int main(int argc, char *argv[])
{
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "freme.ccp");
    Glib::RefPtr<Gtk::Builder> pBuilder = Gtk::Builder::create_from_file("frame.glade");

    frame* pFrame = nullptr;
    pBuilder->get_widget_derived("AppWindow", pFrame);

    app->run(*pFrame);

    delete pFrame;
    return 0;
}

frame.glade 文件与源和输出应用程序位于同一目录中。

1 个答案:

答案 0 :(得分:1)

避免此类问题的一种方法是修改构建脚本以从glade文件生成目标代码,并将这些符号链接到可执行文件中。例如,您可以为glade文件创建构建目标(我假设您正在使用make和makefile)

gladetarget:
        ld  -r -b binary -o somefile.o somefile.glade

然后,您将修改主可执行文件的构建目标,以首先构建此目标,并包含目标文件:

main: gladetarget
        g++ main.cc somefile.o -o myprogram 

(我在上面的例子中省略了GTK标志,但你明白了)。然后,您在代码中定义一个外部变量,并将Gtk :: Builder指向它:

extern char _binary_somefile_glade_start[];
...
Gtk::Builder::create_from_string(_binary_somefile_glade_start);

请注意,您可以使用nm命令在somefile.o中获取符号名称。显然,这种方法有一些缺点。也就是说,如果进行简单的GUI更改,则必须重新编译代码。另一方面,它可以防止人们修改你的GUI。