Comment compiler et lier correctement un programme gdbus

Sep 02 2020

J'essaye d'apprendre le dbus et la compilation / liaison de programmes sur Linux. Je suis assez nouveau dans la création et la liaison d'applications à partir de zéro. À cette fin, je crée une simple application client + serveur sur Ubuntu qui communique via gdbus. J'utilise l'outil gdbus-codegen pour générer des fichiers .c et .h pour les interfaces dbus. J'ai créé un exemple de fichier de description xml nommé 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>    

et je génère le code à l'aide de la commande suivante:

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

qui génère les fichiers generated_code.c et generated_code.h. J'ai inclus le fichier d'en-tête generated_code.h dans mon application client, que j'essaie de compiler avec gcc en utilisant la commande suivante:

    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

Cependant, j'obtiens l'erreur suivante:

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

Pourquoi ce fichier d'en-tête n'est-il pas présent sur mon système? J'ai le répertoire gio dans /usr/include/glib-2.0/gio, et il contient un tas de fichiers d'en-tête - mais pas gunixfdlist.h.

En remarque:

  1. Je n'utilise pas volontairement pkg-config dans la commande build afin de mieux comprendre ce que pkg-config se développe pendant la compilation
  2. Je suppose que je devrai fournir les emplacements réels de la bibliothèque à l'éditeur de liens ainsi qu'à ma commande de construction, mais je voulais d'abord résoudre le problème de ne pas résoudre correctement les inclusions.

Réponses

4 ptomato Sep 02 2020 at 02:46

Le fichier d'en-tête est au format /usr/include/gio-unix-2.0/gio. Comme indiqué dans la documentation :

Notez qu'il <gio/gunixfdlist.h>appartient aux interfaces GIO spécifiques à UNIX, vous devez donc utiliser le gio-unix-2.0.pcfichier pkg-config lors de son utilisation.

Vous devriez donc utiliser pkg-config dans la configuration de votre projet et vous assurer que cela gio-unix-2.0est inclus dans l'invocation qui obtient vos indicateurs de compilation.