2013-01-10 8 views
14

मैं सी बाइंडिंग के साथ डी-बस का उपयोग करने का तरीका सीखने की कोशिश कर रहा हूं। मैंने पहले कभी डी-बस का उपयोग नहीं किया है। मैं इस tutorial का पालन कर रहा हूं, जो मुझे लगता है कि आधिकारिक एक (Freedesktop.org) है। मैंने इसे paragraph तक पढ़ा है जो पहला नमूना प्रोग्राम देता है, लेकिन दुर्भाग्यवश मुझे इस पृष्ठ पर संकलित करने के तरीके या किस पुस्तकालयों को शामिल करने के बारे में कोई संकेत नहीं दिखता है। क्या मैं कुछ भुल गया ?मूल डी-बस/ग्लिब उदाहरण कैसे संकलित करें?

मेरा ओएस उबंटू 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’ 
... 

मैं ट्यूटोरियल में एक बिंदु से वंचित रह गए? यह नहीं, क्या आप कृपया कोड के इस टुकड़े को संकलित करने में मेरी मदद कर सकते हैं?

अग्रिम धन्यवाद।

उत्तर

16

इस तरह के ट्यूटोरियल आम तौर पर मानते हैं कि आपके पास इस भाषा में सी के साथ-साथ ऑपरेटिंग सिस्टम चलाने के लिए लिखी गई भाषा का कुछ ज्ञान है।

ट्यूटोरियल को देखते हुए, मुझे लगता है कि इसमें केवल main फ़ंक्शन शामिल है।

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

इसके अलावा, आप या का उपयोग पूर्व संकलित पुस्तकालयों (इस मामले dbus और dbus-glib में) संकलित करने के लिए की आवश्यकता होगी,,: इस तरह के रूप में, आप काम करने के लिए इस के लिए आदेश में उचित #include निर्देशों जोड़ने की आवश्यकता होगी आपके ऑपरेटिंग सिस्टम से, उन्हें निष्पादन योग्य से जोड़ने के लिए।

आपको स्रोत के साथ प्रदान की गई शीर्षलेख फ़ाइलों या आपके ऑपरेटिंग सिस्टम से "विकास" पैकेज की भी आवश्यकता होगी।

उदाहरण के अनुसार, मेरी उबंटू कार्य केंद्र पर, मैं दोनों स्रोत और हेडर फाइल तो तरह स्थापित कर सकते हैं:

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

एक बार जब वे संकलित किए जाते हैं (या ठीक से स्थापित), आप इस कार्यक्रम को संकलित करने के लिए आगे बढ़ें। आपको कंपाइलर/लिंकर से लिंक करने के लिए उचित शामिल पथ और पुस्तकालय निर्दिष्ट करना होगा। उदाहरण के अनुसार, जीसीसी और मेरे मौजूदा सेटअप के साथ यह होगा:

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 अमल बनाना चाहिए।

माना जाता है कि मेरे पास सी और लिनक्स के साथ कुछ वर्षों का अनुभव है, इसलिए मुझे आसानी से यह सब कुछ पता चला है। यदि आप सी के साथ शुरू करना चाहते हैं, तो शायद आपको कुछ आसान से शुरू करना चाहिए।

+0

आपकी मदद के लिए धन्यवाद। यह मुझे एहसास दिलाता है कि मैंने वास्तव में गलत सवाल पूछा था। मुझे स्पष्ट रूप से यह कहना चाहिए था कि यह सी के बारे में नहीं था। वैसे भी, आपका जवाब इतना पूरा हो गया है कि मुझे मेरा जवाब मिला और मुझे यकीन है कि यह किसी और की मदद करेगा, इसलिए धन्यवाद :) – tvuillemin

+0

ग्रहण में ऐसा करने के तरीके पर कोई सलाह ?? -आई निर्देश परियोजना गुणों में जाते हैं सी/सी ++ जनरल | पथ और प्रतीक | इसमें शामिल है, लेकिन मैं -l निर्देशों को शामिल करने का कोई तरीका नहीं देख सकता हूं ?? मेरे dbus इंस्टॉल शामिल करने के लिए किसी भी पुस्तकालय के साथ नहीं आया ??? –

1

आपके जीसीसी कमांड द्वारा दी गई त्रुटि के आधार पर। जीसीसी <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/dbus-glib.h> शामिल करने के लिए है, के रूप में यह स्वचालित रूप से <dbus.h>

से शामिल नहीं है के बजाय फ़ाइल बनाने के उपयोग करने का प्रयास
3

पर आधार 'है 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 

नोट: इस वेबपेज में एक अच्छा डी-बस उदाहरण है https://developer.gnome.org/gio//2.36/GDBusProxy.html

2

ध्यान दें कि libdbus-चिकना हटाई गई है, unmaintained और तक पहुँचने के लिए नहीं किया जाना चाहिए सी से डी-बस: इसके बजाय GDBus का उपयोग करें। libdbus-1 को या तो अनुशंसित नहीं किया जाता है: इसे बनाए रखा जाता है, लेकिन डी-बस का उपयोग करने के लिए बहुत कम स्तर वाला एपीआई है, और इसमें जीडीबीस की सभी सुविधा सुविधाएं नहीं हैं।

उत्साही कहते हैं, GDBus documentation available अच्छा है।

जबकि इस सवाल का, मेरा बुरा लेखन (libdbus-चिकना और libdbus -1 जानबूझ कर ऐसा रस गूगल देने से बचने के लिए जुड़ा हुआ नहीं।)

संबंधित मुद्दे