Как скомпилировать базовый пример 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