Come compilare e collegare correttamente un programma gdbus

Sep 02 2020

Sto cercando di imparare dbus e compilazione/collegamento di programmi su Linux. Sono abbastanza nuovo nella creazione e nel collegamento di applicazioni da zero. A tal fine, sto creando delle semplici applicazioni client+server su Ubuntu che comunicano tramite gdbus. Sto usando lo strumento gdbus-codegen per generare file .ce .h per le interfacce dbus. Ho creato un file di descrizione XML di esempio denominato 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>    

e sto generando il codice usando il seguente comando:

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

che genera i file code_generated.ce code_generated.h. Ho incluso il file di intestazione generato_code.h all'interno della mia applicazione client, che sto cercando di compilare con gcc usando il seguente 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

Tuttavia, ottengo il seguente errore:

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

Perché questo file di intestazione non è presente sul mio sistema? Ho la directory gio in /usr/include/glib-2.0/gio e contiene un sacco di file di intestazione, ma non gunixfdlist.h.

Come nota a margine:

  1. Non sto usando apposta pkg-config nel comando build per capire meglio a cosa si espande pkg-config durante la compilazione
  2. Immagino che dovrò fornire le posizioni effettive della libreria al linker e al mio comando build, ma prima volevo risolvere il problema della mancata risoluzione degli inclusioni correttamente

Risposte

4 ptomato Sep 02 2020 at 02:46

Il file di intestazione è in /usr/include/gio-unix-2.0/gio. Come indicato nella documentazione :

Nota che <gio/gunixfdlist.h>appartiene alle interfacce GIO specifiche per UNIX, quindi devi usare il gio-unix-2.0.pcfile pkg-config quando lo usi.

Quindi dovresti usare pkg-config nella configurazione del tuo progetto e assicurarti che gio-unix-2.0sia incluso nell'invocazione che ottiene i tuoi flag di compilazione.