当我构建一个使用(加载) .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 文件与源和输出应用程序位于同一目录中。
答案 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。