Cómo compilar y vincular correctamente un programa gdbus

Sep 02 2020

Estoy tratando de aprender dbus y la compilación / vinculación de programas en Linux. Soy bastante nuevo en la creación y vinculación de aplicaciones desde cero. Con este fin, estoy creando aplicaciones simples de cliente + servidor en Ubuntu que se comunican a través de gdbus. Estoy usando la herramienta gdbus-codegen para generar archivos .cy .h para las interfaces dbus. He creado un archivo de descripción xml de muestra llamado dbus_interface.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE node PUBLIC
  "-//freedesktop//DTD D-Bus Object Introspection 1.0//EN"
  "http://standards.freedesktop.org/dbus/1.0/introspect.dtd">
<node> 
    <interface name="org.hello.world">
        <method name="get_magic_number">
            <arg type="i" name="magic_number" direction="out"/>
        </method>
   </interface>
</node>    

y estoy generando el código usando el siguiente comando:

gdbus-codegen --generate-c-code generated_code dbus_interface.xml

que genera los archivos generate_code.cy generate_code.h. He incluido el archivo de encabezado generate_code.h dentro de mi aplicación cliente, que estoy tratando de compilar con gcc usando el siguiente comando:

    gcc -Wall -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include client.c generated_code.c -o client

Sin embargo, aparece el siguiente error:

generated_code.c:17:12: fatal error: gio/gunixfdlist.h: No such file or directory
   17 | #  include <gio/gunixfdlist.h>
      |            ^~~~~~~~~~~~~~~~~~~
compilation terminated.

¿Por qué este archivo de encabezado no está presente en mi sistema? Tengo el directorio gio en /usr/include/glib-2.0/gio, y contiene un montón de archivos de encabezado, pero no gunixfdlist.h.

Como nota al margen:

  1. No estoy usando pkg-config en el comando de compilación a propósito para comprender mejor a qué se expande pkg-config durante la compilación
  2. Supongo que tendré que proporcionar las ubicaciones reales de la biblioteca al enlazador también a mi comando de compilación, pero primero quería resolver el problema de no resolver las inclusiones correctamente.

Respuestas

4 ptomato Sep 02 2020 at 02:46

El archivo de encabezado está en formato /usr/include/gio-unix-2.0/gio. Como se indica en la documentación :

Tenga en cuenta que <gio/gunixfdlist.h>pertenece a las interfaces GIO específicas de UNIX, por lo que debe usar el gio-unix-2.0.pcarchivo pkg-config cuando lo use.

Por lo tanto, debe usar pkg-config en la configuración de su proyecto y asegurarse de que gio-unix-2.0esté incluido en la invocación que obtiene sus indicadores de compilación.