glib GVariant 2

Posted 人,唯一剥夺不了的,只有知识

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了glib GVariant 2相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <glib.h>
#include <stdlib.h>
#include <string.h>

 
 
int 
main (void) 
 
    g_autoptr(GVariant) sessions = NULL; 

    sessions = g_variant_new_parsed ("[(\'2\', uint32 1000, \'nidhoegger\', \'seat0\', objectpath \'/org/freedesktop/login1/session/_32\'), (\'6\', 1001, \'test\', \'seat0\', \'/org/freedesktop/login1/session/_36\'), (\'c2\', 111, \'lightdm\', \'seat0\', \'/org/freedesktop/login1/session/c2\')]"); 

    for (gsize i = 0; i < g_variant_n_children (sessions); i++) 
     
     g_autoptr(GVariant) child = g_variant_get_child_value (sessions, i); 
     g_message ("Child %" G_GSIZE_FORMAT ": %s", i, g_variant_get_type_string (child)); 

     guint32 uid; 
     const gchar *id, *user, *seat, *session_path; 

     g_variant_get (child, "(&su&s&s&o)", &id, &uid, &user, &seat, &session_path); 

     g_message ("%s, %u, %s, %s, %s", id, uid, user, seat, session_path); 
     

    return 0; 
 
    

  

配置不断发现错误的 GLib

【中文标题】配置不断发现错误的 GLib【英文标题】:configure keeps finding the wrong GLib 【发布时间】:2019-11-28 18:23:03 【问题描述】:

我的 cygwin 安装了 glib1.2 和 glib2.0。我的 configure.in 包含以下几行:

AM_PATH_GLIB_2_0(,
[
        AC_DEFINE(HAVE_GLIB)
        LIBS="$LIBS $GLIB_LIBS"
        CFLAGS="$CFLAGS $GLIB_CFLAGS"
], [
        AC_MSG_ERROR([No glib. Bad.  Get it at:  http://www.gtk.org/. ])
])

很遗憾,GLIB_CONFIG 宏包含:

echo -I$prefix/include/glib-1.2

所以每当我执行 ./configure 时,我的 makefile 都会返回到这个:

gcc  -g -O2 -I/usr/include/glib-1.2 

...然后所有调用 2.x 的代码都会抱怨。我可以通过对生成的 makefile 进行一些手动编辑来解决此问题:

GLIB_CFLAGS = -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
GLIB_CONFIG = /usr/bin/glib-config
GLIB_LIBS = -L/usr/lib -lglib-2.0

...但避免这就是您首先使用 autoconf 的原因。问题:

    是否还有另一个 GLIB_CONFIG 应该存在于某处? 2.0应该在安装时改变这个吗?我在 /usr/bin 里翻了一下,那是那里唯一的 gl*。 我不确定我是否理解在配置过程中调用 GLIB_CONFIG 的位置

【问题讨论】:

【参考方案1】:

我个人会通过调用PKG_CHECK_MODULES 宏在configure.ac 中使用pkg-config

m4_pattern_forbid([PKG_CHECK_MODULES])dnl
PKG_CHECK_MODULES([GLIB20], [glib-2.0], [], [dnl
  AC_MSG_ERROR([
   +===================================================+
   | Could not find the required glib-2.0 dev package. |
   | Install the glib2-devel or libglib2-dev package   |
   | or from http://www.gtk.org/ directly.             |
   +===================================================+
])
])

m4_pattern_forbid 可防止 autoreconf 在未定义 PKG_CHECK_MODULES 宏的情况下成功,您可以根据自己的需要调整错误消息。

PKG_CHECK_MODULES 宏适用于大量库,它清楚地定义了您要查找的 API。只需检查 /usr/lib64/pkgconfig/*.pc 文件(您的系统的确切位置可能会有所不同)。

在您的 Makefile.amMakefile-files 文件中,您可以添加 GLIB20 标志,例如

bin_PROGRAMS  = foo
foo_SOURCES   = foo-main.c
foo_CPPFLAGS  = $(top_srcdir)/include
foo_LDADD     = $(top_builddir)/libfoo.la

foo_CPPFLAGS += $(GLIB20_CFLAGS)
foo_LDADD    += $(GLIB20_LIBS)

【讨论】:

以上是关于glib GVariant 2的主要内容,如果未能解决你的问题,请参考以下文章

Glib:DBUS 属性中的 NULL

复杂格式的gvariant解析

获取 GVariant 的内容

无法使用迭代器迭代具有数组类型的 GVariant

配置不断发现错误的 GLib

找不到 glib.h