2_01_GLib库入门与实践_GLib库版本与兼容性

GLib库不断更新,有些函数新增进来,有些函数已过时被废弃,所以,如果不是使用静态编译或不是自带动态库,则基于GLib的应用程序在运行时可能会出现找不到符号的错误。

版本命名规则

GLib-2.0版本的命名规则为GLib-x.xx.xx,我们用的版本为GLib-2.56.4,其版本含义如下:

  • major version:2
  • minor version:56
  • micro version:4

版本兼容性检查函数

GLib提供了两个函数来检查GLib库的版本。

const gchar * 	glib_check_version ()
#define 	GLIB_CHECK_VERSION()

glib_check_version,如果传入的GLib版本参数与当前链接的库版本兼容,则返回空,如果不兼容则返回不兼容的提示原因。
GLIB_CHECK_VERSION,如果传入的GLib版本参数与当前GLib头文件的版本一致或比后者旧,则返回TRUE,否则返回FALSE。
glib_check_version在运行时检查版本兼容性,GLIB_CHECK_VERSION是在编译时检查。

新增函数及已过时函数

GLib库更新非常频繁,有些函数是新增加进来的,有些函数从某个版本开始不再维护。
在官方帮助文档中:如果第一个版本没有这个库函数,则会在函数说明下面标明这个库函数是从哪个版本开始出现的;如果一个函数已过时被废弃不再维护,则会提示,说明这个库函数是从哪个版本开始不再使用的。
下面是官方文档中的两个示例。
g_try_malloc_n()是从2.24版本开始新增的函数:

g_try_malloc_n ()

gpointer
g_try_malloc_n (gsize n_blocks,
                gsize n_block_bytes);

This function is XXXX.
Parameters XXXX
Returns XXXX

Since: 2.24

g_memmove()为从2.40版本开始不再维护的已过时函数,不再建议使用,如果必须要使用内存移动功能,可以使用memmove()函数:

g_memmove()
#define g_memmove(dest,src,len)

g_memmove has been deprecated since version 2.40 and should not be used in newly-written code. 
Just use memmove().

Copies a block of memory XXXX.

版本信息变量

GLib提供了六个变量来标识当前版本信息。

glib_major_version
glib_minor_version
glib_micro_version
GLIB_MAJOR_VERSION
GLIB_MINOR_VERSION
GLIB_MICRO_VERSION

前三个是变量,是从so库中动态获取的,后三个是常量宏,是头文件中定义好的。

示例程序

下面的程序演示了打印GLib提供的六个变量,glib_check_version及GLIB_CHECK_VERSION的用法。
源码工程目录见glib_examples\glib_version\glib_version_basic

#include <glib.h>

int main(int argc, char **argv) 
{
    gchar *str = NULL;
    gboolean ret = FALSE;

    g_print("glib_major_version:%d\n", glib_major_version);
    g_print("glib_minor_version:%d\n", glib_minor_version);
    g_print("glib_micro_version:%d\n", glib_micro_version);

    
    g_print("GLIB_MAJOR_VERSION:%d\n", GLIB_MAJOR_VERSION);
    g_print("GLIB_MINOR_VERSION:%d\n", GLIB_MINOR_VERSION);
    g_print("GLIB_MICRO_VERSION:%d\n", GLIB_MICRO_VERSION);

    str = (gchar *)glib_check_version(2, 70, 1);
    if(NULL != str) {
        g_print("str:%s \n", str);
    } else {
        g_print("GLib library is compatible with your given version(2.70.1) \n");
    }

    str = (gchar *)glib_check_version(2, 0, 1);
    if(NULL != str) {
        g_print("str:%s \n", str);
    } else {
        g_print("GLib library is compatible with your given version(2.0.1) \n");
    }

    ret = GLIB_CHECK_VERSION(2, 0, 1);
    g_print("GLib header files is %s than the given version(2.0.1) \n", 
        ret?"the same as or newer":"not same as or older");
    
    ret = GLIB_CHECK_VERSION(2, 56, 4);
    g_print("GLib header files is %s than the given version(2.56.4) \n", 
        ret?"the same as or newer":"not same as or older");

    ret = GLIB_CHECK_VERSION(2, 70, 0);
    g_print("GLib header files is %s than the given version(2.70.1) \n", 
        ret?"the same as or newer":"not same as or older");
    
    return 0;
}

运行结果:

[root@centos7 build]# ./glib_version
glib_major_version:2
glib_minor_version:56
glib_micro_version:4
GLIB_MAJOR_VERSION:2
GLIB_MINOR_VERSION:56
GLIB_MICRO_VERSION:4
str:GLib version too old (micro mismatch)
GLib library is compatible with your given version(2.0.1)
GLib header files is the same as or newer than the given version(2.0.1)
GLib header files is the same as or newer than the given version(2.56.4)
GLib header files is not same as or older than the given version(2.70.1)
[root@centos7 build]#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值