在我的项目中,我调用gtk_builder_add_from_file
函数来加载一个xml文件,其中包含以前使用Glade设计的ui对象。所以,我有我的二进制程序和(在同一个文件夹中)xml文件。
将所有内容打包到单个可执行文件中的最佳方式是什么?我应该使用自解压脚本吗?或者还有其他东西可以一起编译?
感谢所有
您可以使用GIO中提供的GResource
API。GResources通过在XML文件中定义您希望随应用程序一起交付的资产来工作,类似于以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/com/example/YourApp">
<file preprocess="xml-stripblanks">your-app.ui</file>
<file>some-image.png</file>
</gresource>
</gresources>
请注意prefix
属性,因为稍后将使用它。
添加资产后,使用GLib提供的glib-compile-resources
二进制文件生成一个C文件,该文件包括所有资产,编码为字节数组。生成的代码还将使用各种编译器公开的全局构造函数功能,以便在加载应用程序后(在调用main
之前)加载资源,或者在共享对象的情况下,在链接器加载库后加载资源。Makefile中glib-compiler-resources
调用的一个示例是:
GLIB_COMPILE_RESOURCES = $(shell $(PKGCONFIG) --variable=glib_compile_resources gio-2.0)
resources = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=. --generate-dependencies your-app.gresource.xml
your-app-resources.c: your-app.gresource.xml $(resources)
$(GLIB_COMPILE_RESOURCES) your-app.gresource.xml --target=$0 --sourcedir=. --geneate-source
然后您必须将your-app-resources.c
添加到您的构建中。
为了访问您的资产,您应该使用在各种类中公开的from_resource()
函数;例如,要在GtkBuilder
中加载UI描述,应该使用gtk_builder_add_from_resource()
。使用的路径是您在GResource XML文件中定义的prefix
和文件名的组合,例如:/com/example/YourApp/your-app.ui
。从GFile
加载时,也可以使用resource://
URI。
您可以在GResources API参考页面上找到更多信息。