2011-04-22 11 views
6

Estoy tratando de compilar un programa C, con estos encabezados: http://pastebin.com/SppCXb0U, en Ubuntu. Al principio no tenía un poco de suerte, pero después de leer sobre PKG-config Construí esta línea:Compilando el programa C con archivos de cabecera dbus

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

Sin embargo, todavía no funciona y me da este error:

/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 

No estoy seguro de qué hacer aquí.

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

Una buena explicación - gracias. Sin embargo, no puedo hacer que funcione. Ejecutando su comando arriba (con un agregado) produce el siguiente resultado

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 

Respuesta

12

Su problema no está en los archivos de cabecera, su problema es con las bibliotecas; las quejas sobre "referencias indefinidas" generalmente provienen del vinculador. Es necesario poner las opciones de configuración de la biblioteca después el archivo de origen:

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` 

La opción --libs producirá una serie de -l banderas para el compilador, el compilador pasará los al enlazador. El vinculador resolverá los símbolos de izquierda a derecha comenzando con el archivo objeto (o, lo suficientemente cerca en este caso, el archivo fuente C) para que todos los conmutadores de la biblioteca -l tengan que seguir su archivo fuente.

+0

Muchas gracias por su buena respuesta. El campo de comentarios no es lo suficientemente grande como para publicar mis resultados, así que lo pegué en la publicación principal. –

+0

¿Qué significan las salidas 'pkg-config --libs dbus-1' y' pkg-config --libs glib-2.0'? –

+0

'-L/usr/lib/x86_64-linux-gnu -ldbus-1 -lpthread -lrt' y' -L/usr/lib/x86_64-linux-gnu -lglib-2.0' respectivly –

Cuestiones relacionadas