2013-01-10 22 views
14

CバインディングでD-Busを使用する方法を学習しようとしています。私はかつてDバスを使ったことがありません。私はこのtutorialをフォローしています。公式のもの(Freedesktop.org)です。私は最初のサンプルプログラム を与えるこのparagraphまでこれを読んだことがありますが、残念ながら、このページにはどのようにコンパイルするのか、どのライブラリを含めるべきかはわかりません。私は何か見落としてますか ?基本的なD-Bus/glibの例をコンパイルするには?

私のOSは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’ 
... 

私はチュートリアルのポイントを見逃していましたか?それは、このコードをコンパイルするのを助けてくれますか?

ありがとうございます。

答えて

16

このようなチュートリアルでは、一般に、作成する言語(この場合はC)と実行するオペレーティングシステムについてある程度知識があることが前提です。

チュートリアルを見ると、それにはmain機能しか含まれていないことがわかります。そのため、この機能のために適切な#includeディレクティブを追加する必要があります。また

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

、あなたは(この場合dbusdbus-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で始めることを望んでいるなら、おそらく何かで始めるべきでしょう。

+0

ご協力ありがとうございます。それは私が間違った質問を実際に頼んだことに気付きます。私はそれがCに関するものではないことを明確に伝えたはずです。とにかく、あなたの答えはとても完成していますので、私は自分の答えを得て、他の誰かを助けると確信していますので、ありがとう:) – tvuillemin

+0

Eclipseでこれを行う方法に関するアドバイス?? -Iディレクティブはプロジェクトのプロパティに入ります。c/C++ General |パスと記号|インクルードしますが、-lディレクティブを含める方法はありませんか?私のdbusのインストールには、どのライブラリも含まれていませんでしたか? –

1

gccコマンドによって返されたエラーに基づいています。 gccは<dbus/dbus.h>ファイルを見ることができます(そうでないと、ヘッダファイルを見ることができないことを示すエラーメッセージが表示されます)が、このファイルに存在するいくつかの変数(‘DBusGConnection’および‘GError’)を見ることができません。あなたはDBUS

の十分なバージョンを使用して、代わりに

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

申し訳ありませんが、ちょうどコピー過去の誤りを、この質問、私の悪い書き込み中。 – tvuillemin

2

は、それが自動的に<dbus.h>

で含まれていないとしてあなたは、別途 <dbus/dbus-glib.h>を含めるために持っているように見える一つのコマンドでファイルを作成し使用しようとされていないかもしれ
3

に基づいて '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-バスの例にのlibdbus-glibのは、メンテナンスされていない非推奨となっており、アクセスするために使用すべきではないことをhttps://developer.gnome.org/gio//2.36/GDBusProxy.html

2

注意を持っていますCからのD-Bus:代わりにGDBusを使用してください。 libdbus-1は、維持されていますが、D-Busを使用するためのはるかに低レベルのAPIであり、GDBusのすべての便利な機能を備えていません。

熱狂的な人が言うように、良いのはGDBus documentation availableです。

(のlibdbus-glibのとのlibdbus-1意図的にそれらはジュースをグーグル与えないようにリンクされません。)