J’ai compilé la bibliothèque standard gnu et je l’ai installé dans $GLIBC_INST
.
Maintenant, j’essaye de comstackr un programme très simple (en utilisant un seul #include: #include
):
gcc --nostdinc -I$GLIBC_INST/include foo.c
La compilation (pré-processeur?) Me dit qu’elle ne trouve pas stddef.h
.
Et en effet, il n’existe aucun $GLIBC_INST/include
dans $GLIBC_INST/include
(ni dans /usr/include
). Cependant, j’ai trouvé un stddef.h
dans /usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include
.
Pourquoi ce fichier n’est-il pas sous /usr/include
? Je pensais qu’il appartenait à la bibliothèque standard c et devrait être installé dans $GLIBC_INST/include
.
Comment puis-je comstackr mon foo.c
avec la bibliothèque standard nouvellement installée quand il ne semble pas venir avec un stddef.h
?
Edit: Clarification
Je pense que le titre de cette question n’est pas optimal. Comme indiqué dans certaines réponses, il n’est pas nécessaire que stddef.h
soit dans /usr/include
(ou $GLIBC_INST/include
, d’ailleurs). Je comprends cela.
Mais je me demande comment je peux procéder quand je veux utiliser $GLIBC_INST
. Il me semble évident (bien que je me trompe peut-être ici) que j’ai besoin d’appeler gcc avec --nostdinc
pour ne pas utiliser les fichiers d’en-tête installés par le système. Cela implique que j’utilise -I$GLIB_INST/include
. C’est clair pour moi.
Cependant, ce qui rest obscur pour moi, c’est que: quand j’ajoute également -I/usr/lib/gcc/x86..../include
, comment puis-je être sûr que j’ai en fait les fichiers d’en-tête les plus récents pour la glibc fraîchement compilée ?
En effet, les fichiers sous /usr/include
sont des en-têtes courants fournis par la bibliothèque C, par exemple, glibc
, tandis que les fichiers situés dans /usr/lib/gcc
sont spécifiques à ce compilateur. Il est courant que chaque compilateur ait sa propre implémentation différente de stddef.h
, mais ils utiliseront le même stdio.h
lorsqu’ils sont liés à la bibliothèque C installée.
Lorsque vous dites #include
il n’est pas nécessaire que /usr/include/stddef.h
existe sous la forme d’un fichier sur le disque. Tout ce qui est requirejs d’une implémentation est que #include
fonctionne et qu’il vous donne les fonctionnalités que l’en-tête est censé vous donner.
Dans votre cas, l’implémentation a placé certains de ses fichiers dans un autre chemin de recherche. C’est assez typique.
Pourquoi ce fichier n’est-il pas sous
/usr/include
?
Parce que rien n’exige que les en-têtes standard soient situés dans /usr/include/
.
La mise en œuvre pourrait les placer n’importe où. La seule garantie est que lorsque vous #include
, le compilateur / préprocesseur le localise correctement et l’inclut. Puisque vous désactivez cette option avec l’option -nostdinc
de gcc, vous êtes seul (pour donner correctement l’emplacement de cet en-tête).