2011-04-22 17 views
6

Próbuję skompilować program C, z tymi nagłówkami: http://pastebin.com/SppCXb0U, na Ubuntu. Na początku nie miałem szczęścia w ogóle, ale po przeczytaniu o pkg-config I spreparowane tej linii:Kompilowanie programu C z plikami nagłówkowymi dbus

gcc `pkg-config --cflags --libs dbus-1` `pkg-config --cflags --libs glib-2.0` signals-tutorial.c 

Jednak to nadal nie działa i daje mi ten błąd:

/tmp/cc3BkbdA.o: In function `filter_example': 
signals-tutorial.c:(.text+0x1a3): undefined reference to `dbus_connection_setup_with_g_main' 
/tmp/cc3BkbdA.o: In function `proxy_example': 
signals-tutorial.c:(.text+0x29a): undefined reference to `g_type_init' 
signals-tutorial.c:(.text+0x2b3): undefined reference to `dbus_g_bus_get' 
signals-tutorial.c:(.text+0x323): undefined reference to `dbus_g_proxy_new_for_name' 
signals-tutorial.c:(.text+0x369): undefined reference to `dbus_g_proxy_add_signal' 
signals-tutorial.c:(.text+0x38a): undefined reference to `dbus_g_proxy_connect_signal' 
collect2: ld returned 1 exit status 

Nie jestem pewien, co robić dalej.

==================================

Miły wyjaśnienie - dziękuję. Jednak nie mogę tego uruchomić. Uruchamianie powyższego polecenia (z dodanym) daje następujący wynik:

gcc `pkg-config --cflags dbus-1` \ 
>  `pkg-config --cflags glib-2.0` \ 
>  signals-tutorial.c \ 
>  `pkg-config --libs dbus-1` \ 
>  `pkg-config --libs glib-2.0` 
/tmp/ccjN0QMh.o: In function `filter_example': 
signals-tutorial.c:(.text+0x1a3): undefined reference to `dbus_connection_setup_with_g_main' 
/tmp/ccjN0QMh.o: In function `proxy_example': 
signals-tutorial.c:(.text+0x29a): undefined reference to `g_type_init' 
signals-tutorial.c:(.text+0x2b3): undefined reference to `dbus_g_bus_get' 
signals-tutorial.c:(.text+0x323): undefined reference to `dbus_g_proxy_new_for_name' 
signals-tutorial.c:(.text+0x369): undefined reference to `dbus_g_proxy_add_signal' 
signals-tutorial.c:(.text+0x38a): undefined reference to `dbus_g_proxy_connect_signal' 
collect2: ld returned 1 exit status 

Odpowiedz

12

Twój problem nie dotyczy plików nagłówkowych, Twój problem dotyczy bibliotek; skargi na "niezdefiniowane referencje" zwykle pochodzą od linkera. Trzeba umieścić opcjach Library Configuration po plik źródłowy:

gcc `pkg-config --cflags dbus-glib-1` \ 
    `pkg-config --cflags dbus-1` \ 
    `pkg-config --cflags glib-2.0` \ 
    signals-tutorial.c \ 
    `pkg-config --libs dbus-glib-1` \ 
    `pkg-config --libs dbus-1` \ 
    `pkg-config --libs glib-2.0` 

Opcja --libs będzie produkować serię -l flagi dla kompilatora, kompilator minie ci na łącznik. Łącznik rozdzieli symbole od lewej do prawej, zaczynając od pliku obiektowego (lub wystarczająco blisko w tym przypadku pliku źródłowego C), aby wszystkie przełączniki biblioteki -l musiały podążać za plikiem źródłowym.

+0

Dziękuję bardzo za miłą odpowiedź. Pole komentarza nie jest wystarczająco duże, aby opublikować wyniki, dlatego wkleiłem je w głównym wpisie. –

+0

Co zawiera plik wyjściowy 'pkg-config --libs dbus-1' i' pkg-config --libs glib-2.0'? –

+0

'-L/usr/lib/x86_64-linux-gnu -ldbus-1 -lpthread -lrt' i' -L/usr/lib/x86_64-linux-gnu -lglib-2.0' z szacunkiem –