Как скомпилировать базовый пример D-Bus/glib?

Я пытаюсь научиться использовать D-Bus с привязками C. Я никогда раньше не использовал D-Bus. Я следую этому учебник, который, я полагаю, является официальным (Freedesktop.org). Я читал его до этого абзац это дает первый образец программы , но, к сожалению, я не вижу никаких указаний на этой странице о том, как ее скомпилировать или какие библиотеки включить. Я что-то пропустил ?

моя ОС Ubuntu 10.04 32bit. Я установил libdbus-glib-1-dev пакета. Я пытался добавить #include <dbus/dbus.h> в начале исходного файла, и для компиляции с

$ 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

но я просто не знаю:

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

я пропустил точку в учебнике ? Нет, не могли бы вы помочь мне скомпилировать этот фрагмент кода ?

спасибо заранее.

5 ответов


учебники, подобные этому, обычно предполагают, что у вас есть некоторые знания языка, для которого он написан, в этом случае C, а также операционной системы, на которой вы его запустите.

глядя в учебник, я вижу, что он содержит только . Таким образом, вам нужно будет добавить правильный #include директивы для того, чтобы это работало:

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

кроме того, вам нужно будет скомпилировать библиотеки (в этом случае dbus и dbus-glib), или использовать предварительно скомпилированный те из вашей операционной системы, чтобы связать их с исполняемым файлом.

Вам также понадобятся файлы заголовков, поставляемые с источником, или пакеты "разработка" из вашей операционной системы.

например, на моей рабочей станции Ubuntu я могу установить как исходные, так и заголовочные файлы следующим образом:

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

после их компиляции (или правильной установки) вы приступаете к компиляции программы. Вам нужно будет указать правильные пути включения и библиотек для компилятора/линкера. Например, с GCC и моей текущей настройкой это будет:

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

это должно создать execute a.out в текущем каталоге.

конечно, у меня есть несколько лет опыта работы с C и Linux, поэтому я легко разбираюсь во всем этом. Если вы хотите начать с C, вы, вероятно, должны начать с чего-то проще, хотя.


на основе 'netcoder х' ответ-это программа, которая работала на меня.

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

и 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 

Примечание: эта веб-страница имеет хороший пример D-bushttps://developer.gnome.org/gio//2.36/GDBusProxy.html


Похоже, вы должны включить <dbus/dbus-glib.h> отдельно, так как он не включается автоматически <dbus.h>


обратите внимание, что libdbus-glib устарел, не поддерживается и не должен использоваться для доступа к D-Bus из C: use GDBus вместо. libdbus-1 также не рекомендуется: он поддерживается, но является гораздо более низким уровнем API для использования D-Bus и не имеет всех функций удобства GDBus.

Как говорит enthusiasticgeek, есть хорошо документация GDBus доступна.

(libdbus-glib и libdbus-1 намеренно не связаны, чтобы избежать их предоставления сок Гугла.)


на основе ошибки, возвращенной вашей командой gcc. Gcc может видеть <dbus/dbus.h> file (в противном случае он отобразит сообщение об ошибке, указывающее, что он не может видеть файл заголовка), но не может видеть некоторые переменные, которые должны существовать в этом файле (‘DBusGConnection’ и ‘GError’) . Возможно, вы не используете адекватную версию dbus

и попробуйте использовать make file вместо одной команды

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