45 votes

Pourquoi ne puis-je pas construire un "hello world" pour glib ?

Voici donc le programme le plus simple du monde :

#include <glib.h>

J'essaie de le compiler avec gcc test.c et je reçois :

test.c:1:18: error: glib.h: No such file or directory

Je m'assure donc d'avoir les bons paquets :

# dpkg -l | grep libglib
ii  libglib-perl                              1:1.183-1                               Perl interface to the GLib and GObject libra
ii  libglib1.2-dev                            1.2.10-19build1                         The GLib library of C routines (development)
ii  libglib1.2ldbl                            1.2.10-19build1                         The GLib library of C routines
ii  libglib2.0-0                              2.20.1-0ubuntu2                         The GLib library of C routines
ii  libglib2.0-cil                            2.12.1-1ubuntu2                         CLI binding for the GLib utility library 2.1
ii  libglib2.0-data                           2.18.2-0ubuntu2                         Common files for GLib library
ii  libglib2.0-dev                            2.20.1-0ubuntu2                         Development files for the GLib library
ii  libglibmm-2.4-1c2a                        2.18.1-1                                C++ wrapper for the GLib toolkit (shared lib

Ensuite, je cherche un "glib.h" n'importe où dans /usr/include. J'en obtiens deux, /usr/include/glib-1.2/glib.h et /usr/include/glib-2.0/glib.h. Alors j'essaie :

$ gcc -I/usr/include/glib-2.0 -Wall test.c  
In file included from /usr/include/glib-2.0/glib/galloca.h:34,
             from /usr/include/glib-2.0/glib.h:32,
             from test.c:2:
/usr/include/glib-2.0/glib/gtypes.h:34:24: error: glibconfig.h: No such file or directory

(environ 10 000 autres erreurs coupées)

Je ne semble pas avoir glibconfig.h n'importe où sur mon ordinateur.

Que dois-je faire maintenant ?

1 votes

Peut-être que je suis juste idiot, mais pourquoi essayez-vous de compiler un en-tête ?

14 votes

J'ai commencé par un programme plus complexe, mais si "#include <glib.h>" ne fonctionne pas, rien ne fonctionnera.

0 votes

Si vous n'avez pas de fonction principale, elle sera no travail. Remplacer votre glib.h avec stdio.h ne fonctionne pas non plus. En supposant que vous ayez une fonction principale, la bonne réponse est d'utiliser pkg-config comme mentionné dans une autre réponse.

53voto

Chris Arguin Points 6469

Glib a tendance à se cacher... Votre déclaration d'inclusion ne fonctionne pas parce que GCC ne recherche pas automatiquement les sous-répertoires, et ne peut donc pas voir le glib.h dans glib-1.2 ou glib-2.0.

Lire l'article Compilation des applications GLib dans les manuels de GLIB... vous utilisez des commandes comme pkg-config --cflags glib-2.0 pour obtenir les bons drapeaux pour GCC.

La façon canonique de faire ce que vous essayez est la suivante

% gcc test.c -Wall -o test `pkg-config --cflags --libs glib-2.0`

Notez les crochets arrière, qui indiquent au shell d'exécuter la commande pkg-config "en place".

4 votes

Ceci n'est pas caché : glibconfig.h est une liste de données dépendantes de l'archive et ne fait donc pas partie de /usr/include. On le trouve généralement sous /usr/lib/glib2/...

42voto

tml Points 563
> > The canonical way to do what you are trying is

> % gcc test.c -Wall -o test `pkg-config --cflags --libs glib-2.0`

Désolé, mais non. Il s'agit d'une idée fausse courante, qui fonctionne dans la plupart des cas sur les systèmes basés sur ELF, Linux en particulier. La méthode canonique consiste à passer les cflags et les bibliothèques séparément, dans les emplacements corrects et traditionnels sur la ligne de commande, comme ceci :

gcc -Wall -o test `pkg-config --cflags glib-2.0` test.c `pkg-config --libs glib-2.0`

Il est dommage que pkg-config accepte les options --cflags et --libs en même temps, car cela signifie que ce mème incorrect ne mourra jamais, et que les personnes habituées à le faire sous Linux continueront à être déconcertées lorsqu'elles essaieront ensuite de faire de même sur d'autres plateformes.

1 votes

+1 pour la bravoure ! Strictement parlant, le nom du fichier de code source devrait être placé à la fin, après toutes les options.

6 votes

Désolé, mais ce n'est pas vrai. Avez-vous essayé de le faire de cette façon sur une plateforme non-Linux, par exemple MinGW ? Voir par exemple gcc.gnu.org/onlinedocs/gcc/Link-Options.html qui dit clairement : "L'endroit de la commande où vous écrivez cette option n'a aucune importance ; l'éditeur de liens recherche et traite les bibliothèques et les fichiers d'objets dans l'ordre où ils sont spécifiés. Ainsi, foo.o -lz bar.o' searches library z' après le fichier foo.o mais avant bar.o. Si bar.o fait référence à des fonctions dans `z', ces fonctions ne peuvent pas être chargées".

8voto

sobingt Points 161

Comme @chris ladite utilisation pkg-config .

glibconfig.h is missing 

c'est parce que ce fichier n'est pas dans le répertoire /usr/include/glib-2.0 mais en /usr/lib/glib-2.0. Vous devez donc inclure aussi ceci /usr/lib ou copier le fichier dans le répertoire /include/glib-2.0

0voto

Amninder Singh Points 163

J'utilise glib.h comme bien Faites ceci pour compiler tous vos programmes glib.h :)

gcc `pkg-config --cflags --libs glib-2.0` filename.c

Assurez-vous d'entourer pkg-config --cflags --libs glib-2.0 avec des guillemets que l'on trouve sous le tilde (touche la plus à gauche du clavier querty).

Remercie-moi plus tard :P

-3voto

Ken Points 1584

apt-get build-dep est votre ami - personne ne peut se souvenir de tous les paquets dont vous avez besoin pour construire quelque chose.

2 votes

Le fichier est bien présent, donc une commande de gestion des paquets spécifique à Debian ne va pas résoudre le problème. en utilisant pkg-config correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X