Pourquoi stddef.h ne se trouve-t-il pas dans / usr / include?

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).