dbus-glib uses the libdbus
reference implementation, GDBus doesn't. Instead, it
relies on GIO streams as transport layer, and has its own
implementation for the D-Bus connection setup and
authentication. Apart from using streams as transport,
avoiding libdbus also lets GDBus avoid some thorny
multithreading issues.
dbus-glib uses the GObject type system for method arguments and
return values, including a homegrown container specialization
mechanism. GDBus relies on the GVariant type system which is
explicitly designed to match D-Bus types.
dbus-glib models only D-Bus interfaces and does not provide
any types for objects. GDBus models both D-Bus interfaces
(via the GDBusInterface, GDBusProxy and
GDBusInterfaceSkeleton types) and objects (via the
GDBusObject, GDBusObjectSkeleton and GDBusObjectProxy types).
GDBus includes native support for the org.freedesktop.DBus.Properties (via the GDBusProxy type) and org.freedesktop.DBus.ObjectManager D-Bus interfaces, dbus-glib doesn't.
The typical way to export an object in dbus-glib involves
generating glue code from XML introspection data using
dbus-binding-tool. GDBus provides a
similar tool called gdbus-codegen that
can also generate Docbook D-Bus interface documentation.
dbus-glib doesn't provide any convenience API for owning and
watching bus names, GDBus provides the g_bus_own_name() and
g_bus_watch_name() family of convenience functions.
GDBus provides API to parse, generate and work with Introspection
XML, dbus-glib doesn't.
GTestDBus provides API to create isolated unit tests GDBus Test Scaffolding.