CバインディングでD-Busを使用する方法を学習しようとしています。これまでにD-Busを使用したことがありません。私はこれに従います tutorial 、これは公式のもの(Freedesktop.org)だと思います。最初のサンプルプログラムを提供するこの paragraph まで読みましたが、残念ながら、このページには、コンパイル方法や含めるライブラリについて何も表示されていません。私は何か見落としてますか ?
私のOSはUbuntu 10.04 32ビットです。 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’
...
チュートリアルのポイントを見逃しましたか?そうではありません。このコードのコンパイルを手伝っていただけませんか。
前もって感謝します。
このようなチュートリアルでは、一般に、作成対象の言語(この場合はC)と、それを実行するオペレーティングシステムについてある程度の知識があることを前提としています。
チュートリアルを見ると、main
関数しか含まれていないことがわかります。そのため、これを機能させるには、適切な#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
これにより、現在のディレクトリに実行可能ファイルa.out
が作成されます。
確かに、私はCおよびLinuxで数年の経験があるので、それらすべてを簡単に理解できます。 Cから始めようとしている場合は、おそらくもっと簡単なものから始める必要があります。
Libdbus-glibは非推奨であり、メンテナンスされていないため、CからD-Busにアクセスするために使用しないでください。代わりに GDBus を使用してください。 libdbus-1も推奨されません。維持されますが、D-Busを使用するためのはるかに低レベルのAPIであり、GDBusのすべての便利な機能を備えていません。
Enthusiasticgeekが言うように、良い GDBusドキュメントが利用可能 があります。
(libdbus-glibとlibdbus-1は、Googleジュースを与えないように意図的にリンクされていません。)
'netcoder'sに基づいて、答えは私のために働いたプログラムです。
#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
注:このWebページには、良いDバスの例 https://developer.gnome.org/gio//2.36/GDBusProxy。 html
<dbus/dbus-glib.h>
は自動的にインクルードしないため、<dbus.h>
を個別にインクルードする必要があるようです
Gccコマンドによって返されたエラーに基づいています。 gccは<dbus/dbus.h>
ファイル(それ以外の場合は、ヘッダーファイルを表示できないことを示すエラーメッセージが表示されます)が、このファイルに存在するはずのいくつかの変数を表示できません(‘DBusGConnection’
および‘GError’
)。適切なバージョンのdbusを使用していない可能性があります
そして、1つのコマンドの代わりにメイクファイルを使用してみてください
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