Wie kompiliere ich ein einfaches D-Bus/glib-Beispiel?

Lesezeit: 5 Minuten

Benutzer-Avatar
tvuillemin

Ich versuche zu lernen, wie man D-Bus mit C-Bindungen verwendet. D-Bus habe ich noch nie benutzt. Ich verfolge das Lernprogramm, von dem ich annehme, dass es das offizielle ist (Freedesktop.org). Ich habe es bis jetzt gelesen Absatz das gibt ein erstes Beispielprogramm , aber leider sehe ich auf dieser Seite keinen Hinweis darauf, wie man es kompiliert oder welche Bibliotheken einzubinden sind. Habe ich etwas verpasst ?

Mein Betriebssystem ist Ubuntu 10.04 32bit. Ich habe die installiert libdbus-glib-1-dev Paket. Ich habe versucht hinzuzufügen #include <dbus/dbus.h> am Anfang der Quelldatei und zum Kompilieren

$ 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

aber ich scheitere immer wieder:

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

Habe ich einen Punkt im Tutorial übersehen? Könnten Sie mir bitte helfen, diesen Code zu kompilieren?

Danke im Voraus.

Benutzer-Avatar
Netcoder

Tutorials wie dieses setzen im Allgemeinen voraus, dass Sie einige Kenntnisse der Sprache haben, für die es geschrieben wurde, in diesem Fall C, sowie des Betriebssystems, auf dem Sie es ausführen werden.

Wenn ich mir das Tutorial anschaue, sehe ich, dass es nur a enthält main Funktion. Daher müssen Sie die richtige hinzufügen #include Anweisungen, damit dies funktioniert:

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

Außerdem müssen Sie die Bibliotheken kompilieren (in diesem Fall dbus und dbus-glib), oder verwenden Sie die vorkompilierten aus Ihrem Betriebssystem, um sie mit der ausführbaren Datei zu verknüpfen.

Sie benötigen außerdem die mit der Quelle bereitgestellten Header-Dateien oder die “Entwicklungspakete” Ihres Betriebssystems.

Beispielsweise kann ich auf meiner Ubuntu-Workstation sowohl die Quell- als auch die Header-Dateien wie folgt installieren:

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

Sobald sie kompiliert (oder ordnungsgemäß installiert) sind, fahren Sie mit dem Kompilieren des Programms fort. Sie müssen die richtigen Include-Pfade und Bibliotheken angeben, um sie mit dem Compiler/Linker zu verknüpfen. Mit GCC und meinem aktuellen Setup wäre es beispielsweise:

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

Dies sollte eine ausführbare Datei erstellen a.out im aktuellen Verzeichnis.

Zugegeben, ich habe ein paar Jahre Erfahrung mit C und Linux, sodass ich all diese Dinge leicht herausfinden kann. Wenn Sie mit C beginnen möchten, sollten Sie jedoch wahrscheinlich mit etwas Einfacherem beginnen.

  • Danke für Ihre Hilfe. Da wird mir klar, dass ich eigentlich die falsche Frage gestellt habe. Ich hätte deutlich sagen sollen, dass es nicht um C ging. Wie auch immer, deine Antwort ist so vollständig, dass ich meine Antwort bekommen habe und ich bin sicher, dass sie jemand anderem helfen wird, also danke 🙂

    – tvuillemin

    11. Januar 2013 um 8:51 Uhr

  • Irgendwelche Ratschläge, wie man das in Eclipse macht? Die Direktiven -I gehen in die Projekteigenschaften c/c++ General | Pfad und Symbole | Enthält, aber ich sehe keine Möglichkeit, die -l-Direktiven einzuschließen ?? Meine dbus-Installation enthielt keine einzuschließenden Bibliotheken ???

    – Paul Gorbas

    22. September 2014 um 19:31 Uhr

Beachten Sie, dass libdbus-glib veraltet ist, nicht gewartet wird und nicht für den Zugriff auf D-Bus von C: verwendet werden sollte GDBus stattdessen. libdbus-1 wird auch nicht empfohlen: es wird gepflegt, ist aber eine viel niedrigere API für die Verwendung von D-Bus und hat nicht alle praktischen Funktionen von GDBus.

Wie enthusiastischer Geek sagt, gibt es Gutes GDBus-Dokumentation verfügbar.

(libdbus-glib und libdbus-1 sind absichtlich nicht verlinkt, um zu vermeiden, dass sie Google Juice bekommen.)

Benutzer-Avatar
begeisterter Aussenseiter

Bezogen auf ‘Netcoder’s’ Antwort ist das Programm, das für mich funktioniert hat.

#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;
}

und 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 

Notiz: Diese Webseite hat ein gutes D-Bus-Beispiel https://developer.gnome.org/gio//2.36/GDBusProxy.html

Sieht so aus, als müssten Sie einschließen <dbus/dbus-glib.h> separat, da es nicht automatisch von enthalten ist <dbus.h>

Benutzer-Avatar
MOHAMED

Basierend auf dem von Ihrem gcc-Befehl zurückgegebenen Fehler. Der gcc kann die sehen <dbus/dbus.h> Datei (ansonsten wird eine Fehlermeldung angezeigt, die besagt, dass er die Header-Datei nicht sehen kann), aber er kann einige Variablen nicht sehen, die in dieser Datei vorhanden sein sollten (‘DBusGConnection’ und ‘GError’) . Möglicherweise verwenden Sie nicht die geeignete Version von dbus

und versuchen Sie, make file anstelle eines Befehls zu verwenden

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

  • Entschuldigung, nur ein Copy-Past-Fehler beim Schreiben dieser Frage, mein Fehler.

    – tvuillemin

    10. Januar 2013 um 17:14 Uhr

  • Entschuldigung, nur ein Copy-Past-Fehler beim Schreiben dieser Frage, mein Fehler.

    – tvuillemin

    10. Januar 2013 um 17:14 Uhr

1246910cookie-checkWie kompiliere ich ein einfaches D-Bus/glib-Beispiel?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy