从 girepository-1.0 升级到 girepository-2.0

从 girepository-1.0 升级到 girepository-2.0

libgirepository 原本是 gobject-introspection 的一部分,在那里它被原形化了许多年。

现在它被认为已经稳定(长时间以来),它已被移动到 glib 中,以便简化这两个模块的构建过程。

作为这次迁移的一部分,API 版本已从 1.0 升级到 2.0,并且进行了一些相当直接的 API 变更。请注意,GIR 版本之前是 2.0,现在是 3.0 —— 因此新的 libgirepository 版本使用 girepository-2.0.pcGIRepository-3.0.typelib

libgirepository 两个版本之间的主要变化是,它现在使用 GTypeInstance 作为其类型系统的基础,而不是简单的 C 结构体别名。这意味着 GIBaseInfo 实例现在使用 gi_base_info_ref()gi_base_info_unref() 进行引用计数。

这也意味着现在可以提供运行时转换宏,如 GI_CALLABLE_INFO()。使用这些替代简单的 C 转换可以提高你的代码的运行时类型安全性。

一些 GIBaseInfo 子类型的堆分配仍然可能,但一旦完成,它们现在必须使用 gi_base_info_clear() 来清除。之前这并不是必须的。

作为移转代码的一部分,符号前缀已从 g_ 更改为 gi_ —— 这影响了库中的每个 API,但微不足道。

各种函数参数的类型已更改 —— 例如,大多数偏移量从 guint32 更改为 size_t。如果启用了整数类型警告,这将需要在你的代码中进行一些小的调整。

版本 1.0 到 2.0 的 API 替换

girepository-1.0 girepository-2.0
GI_CHECK_VERSION GLIB_CHECK_VERSION()
g_arg_info_get_closure gi_arg_info_get_closure_index()
g_arg_info_get_destroy gi_arg_info_get_destroy_index()
g_arg_info_get_type gi_arg_info_get_type_info()
g_arg_info_load_type gi_arg_info_load_type_info()
- gi_base_info_ref()gi_base_info_unref()
g_base_info_get_type 使用类型检查宏如 GI_IS_OBJECT_INFO(),或者使用 GTypeG_TYPE_FROM_INSTANCE() 进行原始类型检查
g_info_new 已删除,请使用 gi_repository_find_by_name() 和相关 API
g_callable_info_invoke 参数 is_methodthrowsgi_callable_info_invoke() 中已删除
g_constant_info_get_type gi_constant_info_get_type_info()
g_field_info_get_type gi_field_info_get_type_info()
g_object_info_find_method_using_interfacesg_object_info_find_vfunc_using_interfaces 输出参数 implementor 已重命名为 declarer,并且现在是 GIBaseInfo 类型
g_object_info_get_type_init gi_object_info_get_type_init_function_name()
g_object_info_get_ref_function gi_object_info_get_ref_function_name()
g_object_info_get_unref_function gi_object_info_get_unref_function_name()
g_object_info_get_set_value_function gi_object_info_get_set_value_function_name()
g_object_info_get_get_value_function gi_object_info_get_get_value_function_name()
g_property_info_get_type gi_property_info_get_type_info()
g_registered_type_info_get_type_init gi_registered_type_info_get_type_init_function_name()
g_irepository_* gi_repository_*
g_irepository_get_default 已删除单例对象;创建单独的 GIRepository 实例
g_irepository_get_search_pathg_irepository_get_library_path 现在返回数组而不是链表
g_irepository_enumerate_versions 现在返回数组而不是链表
g_irepository_get_immediate_dependenciesg_irepository_get_dependenciesg_irepository_get_loaded_namespaces 现在另外返回一个长度参数
g_irepository_get_shared_library gi_repository_get_shared_libraries()
g_irepository_dump 接受结构化 input_filenameoutput_filename 参数,而不是单个格式化的字符串
g_function_invoker_destroy gi_function_invoker_clear()
g_struct_info_get_copy_function gi_struct_info_get_copy_function_name()
g_struct_info_get_free_function gi_struct_info_get_free_function_name()
g_type_info_get_array_lengthg_type_info_get_array_fixed_size 将成功和失败返回值拆分到新的输出参数和返回值中
g_type_info_get_array_length gi_type_info_get_array_length_index()
g_typelib_new_from_* 所有替换为 gi_typelib_new_from_bytes()
g_typelib_free GITypelib 现在是一个带引用计数的封装类型,所以使用 gi_typelib_unref()
GI_FUNCTION_THROWSGI_VFUNC_THROWS gi_callable_info_can_throw_gerror()
g_union_info_get_discriminator_offset 将成功和失败返回值拆分到新的输出参数和返回值中
g_union_info_get_copy_function gi_union_info_get_copy_function_name()
g_union_info_get_free_function gi_union_info_get_free_function_name()
GIInfoType 直接使用 GType
GI_INFO_TYPE_BOXED 由于 gi_registered_type_info_is_boxed() 的存在而被废弃

从版本 1.0 到 2.0 的实用程序重命名

girepository-1.0 girepository-2.0
g-ir-compiler gi-compile-repository
g-ir-generate gi-decompile-typelib
g-ir-inspect gi-inspect-typelib

此外,一些命令行选项已经更改。

g-ir-inspect 的 --version 选项已在 gi-inspect-typelib 中重命名为 --typelib-version

gi-decompile-typelib 的 --includedir 选项将给定的目录按照最重要的优先级排序,与此类似的是 gi-compile-repository --includedir 和 gcc -I。g-ir-generate 将 --includedir 选项视为最不重要的优先级排序。

在 gi-compile-repository 中已移除未实现的 g-ir-compiler --module 选项。

在 gi-decompile-typelib 中已移除未实现的 g-ir-generate --shlib 选项。

gi-inspect-typelib 只接受一个命名空间参数。g-ir-inspect 接受多个命名空间,但只会检查第一个,其他将被忽略。