Comment comstackr un exemple basique D-Bus / glib?

J’essaie d’apprendre à utiliser D-Bus avec les liaisons C. Je n’ai jamais utilisé D-Bus auparavant. Je suis ce tutoriel , qui est le plus officiel (Freedesktop.org). Je l’ai lu jusqu’à ce paragraphe qui donne un premier exemple de programme, mais malheureusement, cette page ne contient aucune indication sur la manière de le comstackr ni sur les bibliothèques à inclure. Ai-je manqué quelque chose ?

Mon système d’exploitation est Ubuntu 10.04 32bit. J’ai installé le libdbus-glib-1-dev . J’ai essayé d’append #include au début du fichier source et de comstackr avec

 $ gcc -ldbus-1 -I/usr/include/dbus-1.0/ -I/usr/lib/i386-linux-gnu/dbus-1.0/include -o my_dbus.bin my_dbus.c 

mais je continue juste à échouer:

 my_dbus.c: In function 'main': my_dbus.c:7:3: error: unknown type name 'DBusGConnection' my_dbus.c:8:3: error: unknown type name 'GError' ... 

Ai-je oublié un point dans le tutoriel? Ce n’est pas, pourriez-vous s’il vous plaît m’aider à comstackr ce morceau de code?

Merci d’avance.

Les didacticiels comme celui-ci supposent généralement que vous connaissez le langage pour lequel il a été écrit, dans ce cas, C, ainsi que le système d’exploitation sur lequel vous l’exécuterez.

En regardant le tutoriel, je constate qu’il ne contient qu’une fonction main . En tant que tel, vous devrez append les directives #include appropriées pour que cela fonctionne:

 #include  // for exit() #include  // for dbus_* #include  // for dbus_g_* 

De plus, vous devrez comstackr les bibliothèques (dans ce cas, dbus et dbus-glib ), ou utiliser celles pré-compilées à partir de votre système d’exploitation, afin de les lier à l’exécutable.

Vous aurez également besoin des fichiers d’en-tête fournis avec la source ou des packages de “développement” de votre système d’exploitation.

Par exemple, sur mon poste de travail Ubuntu, je peux installer à la fois les fichiers source et les fichiers d’en-tête de la manière suivante:

 sudo apt-get -y install dbus libdbus-1-dev libdbus-glib-1-2 libdbus-glib-1-dev 

Une fois qu’ils sont compilés (ou correctement installés), vous procédez à la compilation du programme. Vous devrez spécifier les chemins d’inclusion et les bibliothèques appropriés pour créer un lien vers le compilateur / éditeur de liens. Par exemple, avec GCC et ma configuration actuelle, ce serait:

 gcc test.c -I/usr/include/dbus-1.0 \ -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include \ -I/usr/include/glib-2.0 \ -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/ \ -ldbus-1 \ -ldbus-glib-1 -Wall -Wextra 

Cela devrait créer un execute a.out dans le répertoire en cours.

Certes, j’ai quelques années d’expérience avec C et Linux, alors je comprends facilement tout cela. Si vous cherchez à commencer par C, vous devriez probablement commencer par quelque chose de plus simple.

Basé sur la réponse de ‘netcoder’, c’est le programme qui a fonctionné pour moi.

 #include  // for exit() #include  // for dbus_* #include  // for dbus_g_* int main (int argc, char **argv) { DBusGConnection *connection; GError *error; DBusGProxy *proxy; char **name_list; char **name_list_ptr; g_type_init (); error = NULL; connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); if (connection == NULL) { g_printerr ("Failed to open connection to bus: %s\n", error->message); g_error_free (error); exit (1); } /* Create a proxy object for the "bus driver" (name "org.freedesktop.DBus") */ proxy = dbus_g_proxy_new_for_name (connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); /* Call ListNames method, wait for reply */ error = NULL; if (!dbus_g_proxy_call (proxy, "ListNames", &error, G_TYPE_INVALID, G_TYPE_STRV, &name_list, G_TYPE_INVALID)) { /* Just do demonstrate remote exceptions versus regular GError */ if (error->domain == DBUS_GERROR && error->code == DBUS_GERROR_REMOTE_EXCEPTION) g_printerr ("Caught remote method exception %s: %s", dbus_g_error_get_name (error), error->message); else g_printerr ("Error: %s\n", error->message); g_error_free (error); exit (1); } /* Print the results */ g_print ("Names on the message bus:\n"); for (name_list_ptr = name_list; *name_list_ptr; name_list_ptr++) { g_print (" %s\n", *name_list_ptr); } g_strfreev (name_list); g_object_unref (proxy); return 0; } 

et Makefile

 file=1 sample: g++ -g $(file).cc -o $(file) -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/ -ldbus-1 -ldbus-glib-1 -Wall -Wextra -lglib-2.0 -lgio-2.0 -lgobject-2.0 -lgthread-2.0 

Remarque: cette page Web contient un bon exemple de D-bus https://developer.gnome.org/gio//2.36/GDBusProxy.html.

On dirait que vous devez inclure séparément, car il n’est pas automatiquement inclus par

Notez que libdbus-glib est obsolète, non maintenu et ne doit pas être utilisé pour accéder à D-Bus à partir de C: utilisez plutôt GDBus . libdbus-1 n’est pas recommandé non plus: il est maintenu, mais est une API de niveau beaucoup plus bas pour utiliser D-Bus et ne possède pas toutes les fonctionnalités pratiques de GDBus.

Comme enthousiaste dit, il existe une bonne documentation GDBus disponible .

(libdbus-glib et libdbus-1 délibérément non liés pour éviter de leur donner du jus de google.)

Basé sur l’erreur renvoyée par votre commande gcc. Le gcc peut voir le fichier (sinon il affichera un message d’erreur indiquant qu’il n’est pas capable de voir le fichier d’en-tête) mais ne peut pas voir certaines variables qui devraient exister dans ce fichier ( 'DBusGConnection' et 'GError' ). Peut-être que vous n’utilisez pas la version adéquate de dbus

et essayez d’utiliser make file au lieu d’une commande

 LDFLAGS+=-ldbus CFLAGS+=-I/usr/include/dbus-1.0/ CFLAGS+=-I/usr/lib/i386-linux-gnu/dbus-1.0/include all: dbus-example.bin %.o: %.c $(CC) $(CFLAGS) -c -o $@ $^ dbus-example.bin: my_dbus.o $(CC) $(LDFLAGS) -o $@ $^ clean: rm -f *.o dbus-example.bin