2013-01-10 11 views
14

Sto cercando di imparare come usare D-Bus con i collegamenti C. Non ho mai usato D-Bus prima. Sto seguendo questo tutorial, che presumo sia quello ufficiale (Freedesktop.org). L'ho letto fino a questo paragraph che fornisce un primo programma di esempio , ma sfortunatamente non vedo alcuna indicazione su questa pagina su come compilarlo o su quali librerie includere. Ho dimenticato qualcosa ?Come compilare un esempio di base D-Bus/glib?

Il mio sistema operativo è Ubuntu 10.04 32 bit. Ho installato il pacchetto libdbus-glib-1-dev. Ho provato ad aggiungere #include <dbus/dbus.h> all'inizio del file di origine, e di compilare con

$ 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 

, ma io continuo a non aver:

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’ 
... 

Mi sono perso un punto nel tutorial? Non è così, potresti per favore aiutarmi a compilare questo pezzo di codice?

Grazie in anticipo.

risposta

16

Tutorial come questo generalmente presuppongono che tu abbia una certa conoscenza della lingua per cui è stata scritta, in questo caso C, così come del sistema operativo su cui verrà eseguito.

Guardando il tutorial, vedo che contiene solo una funzione main. Come tale, è necessario aggiungere le appropriate #include direttive in modo che questo lavoro:

#include <stdlib.h>   // for exit() 
#include <dbus/dbus.h>  // for dbus_* 
#include <dbus/dbus-glib.h> // for dbus_g_* 

Inoltre, è necessario compilare le librerie (in questo caso dbus e dbus-glib), o utilizzare il compilato pre- quelli del tuo sistema operativo, per collegarli all'eseguibile.

Avrete anche bisogno dei file di intestazione forniti con il sorgente o dei pacchetti di "sviluppo" dal vostro sistema operativo.

Per esempio, sulla mia workstation Ubuntu, posso installare i file di origine e l'intestazione in questo modo:

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

Una volta che essi vengono compilati (o installati correttamente), si procede per compilare il programma. Sarà necessario specificare i percorsi di inclusione e le librerie appropriati per collegarsi al compilatore/linker. Per esempio, con GCC e la mia messa a punto corrente sarebbe:

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 

Questo dovrebbe creare un eseguire a.out nella directory corrente.

Certo, ho alcuni anni di esperienza con C e Linux, quindi ho capito facilmente tutte queste cose. Se stai cercando di iniziare con C, probabilmente dovresti iniziare con qualcosa di più facile però.

+0

Grazie per il vostro aiuto. Mi fa capire che in realtà ho fatto la domanda sbagliata. Avrei dovuto dire chiaramente che non si trattava di C. Ad ogni modo, la tua risposta è così completa che ho ottenuto la mia risposta e sono sicuro che aiuterà qualcun altro, quindi grazie :) – tvuillemin

+0

Qualche consiglio su come farlo in Eclipse ?? Le direttive -I entrano nelle proprietà del progetto c/C++ Generale | Sentiero e simboli | Include, ma non riesco a vedere un modo per includere le direttive -l ?? La mia installazione dbus non è stata inclusa con nessuna libreria da includere ??? –

1

In base all'errore restituito dal comando gcc. Gcc è in grado di vedere il file <dbus/dbus.h> (altrimenti visualizzerà un messaggio di errore che indica che non è in grado di vedere il file di intestazione) ma non è in grado di vedere alcune variabili che dovrebbero esistere in questo file (‘DBusGConnection’ e ‘GError’). Può essere non si sta utilizzando la versione adeguata di dbus

e tenta di utilizzare fare file invece di un comando

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 [email protected] $^ 

dbus-example.bin: my_dbus.o 
    $(CC) $(LDFLAGS) -o [email protected] $^ 

clean: 
    rm -f *.o dbus-example.bin 
+0

solo un errore di Siamo spiacenti, copia-passato durante la scrittura a questa domanda, il mio male. – tvuillemin

2

Sembra che è necessario includere <dbus/dbus-glib.h> a parte, in quanto non è incluso automaticamente da <dbus.h>

3

Basato su 'netcoder's' risposta è il programma che ha funzionato per me.

#include <stdlib.h>   // for exit() 
#include <dbus/dbus.h>  // for dbus_* 
#include <dbus/dbus-glib.h> // 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; 
} 

e 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 

Nota: Questa pagina web è un buon esempio D-bus https://developer.gnome.org/gio//2.36/GDBusProxy.html

2

noti che libdbus-glib è deprecato, non più mantenuto e non deve essere utilizzato per l'accesso D-Bus da C: utilizzare invece GDBus. libdbus-1 non è consigliato neanche: è mantenuto, ma è un'API molto più basso per l'uso di D-Bus e non ha tutte le funzionalità di GDBus.

Come dice entusiasticamente, c'è il buono GDBus documentation available.

(libdbus-glib e libdbus-1 volutamente non collegate per evitare di dare loro google succo.)

Problemi correlati