Erreur "inclusion non résolue" avec les en-têtes de bibliothèque standard Eclipse CDT pour C

96

J'ai configuré CDT pour eclipse et j'ai écrit un programme simple hello world C:

#include <stdio.h>

int main(void){
    puts("Hello, world.");
    return 0;
}

Le programme se construit et s'exécute correctement, mais eclipse continue d'afficher ce point d'interrogation jaune à côté de l'instruction d'inclusion qui indique "Unresolved inclusion: <stdio.h>"quand je place la souris dessus.

Cela n'affecte pas l'exécution du programme mais je trouve cela plutôt ennuyeux.

Quelqu'un at-il une idée de la façon de le supprimer?

Derrick Zhang
la source
2
Vous penseriez que l'exemple Hello World le ferait pour vous, ou du moins fournirait une aide. Si eclipse n'inclut pas de compilateur, pourquoi pas?
Doug Molineux

Réponses:

50

Le compilateur utilisé par Eclipse est capable de résoudre les symboles très bien, de sorte que le code se compilera correctement.

Mais l'achèvement de code / indexeur ou le préprocesseur qu'utilise Eclipse ne sait pas où il stdio.hexiste.

Vous devez spécifier le chemin du système de fichiers où stdio.hse trouve.

La documentation Eclipse décrit cela dans plusieurs sections pour le compilateur:

Et si l'achèvement de code / indexeur ou le préprocesseur ne peut pas non plus localiser stdio.h:

L'emplacement exact de stdio.hdépendra du système pour lequel vous avez l'intention d'écrire le code. Si vous écrivez du code pour le même système sur lequel vous exécutez Eclipse, l'emplacement standard est /usr/include/stdio.hpour Linux, macOS, Cygwin, etc.

Si vous effectuez une compilation croisée pour un système cible séparé / distant (par exemple Android, Raspberry Pi, STM32), il se trouvera quelque part dans le SDK que vous avez installé pour ce système. Vous devrez vous référer à cette documentation SDK particulière.

ardnew
la source
2
Merci pour la réponse. Mais où est le chemin pour Ubuntu 11.10?
Derrick Zhang
Une chose qui m'a dérouté était que je devais ajouter le chemin à l'onglet "comprend", plutôt que l'onglet "chemins de bibliothèque". J'ai toujours pensé que les "anglebracket" inclus étaient des "bibliothèques" inclus.
aaaidan
1
Vous spécifiez où trouver les fichiers d'en-tête (c'est-à-dire les fichiers .h) dans l'onglet inclut. Vous indiquez à l'éditeur de liens où il peut trouver les fichiers de bibliothèque compilés dans l'onglet Chemin de la bibliothèque. La convention des guillemets par rapport aux chevrons dépend probablement du compilateur, mais je pense toujours à <> comme signifiant regarder d'abord dans la bibliothèque système standard et "" comme signifiant regarder d'abord dans mon projet.
Tod
2
Les compilateurs modernes ne font aucune distinction entre les guillemets et les chevrons. Les en-têtes de système standard conventionnels sont toujours placés entre crochets angulaires.
Seppo Enarvi
53

J'ai trouvé ces réponses (y compris celle acceptée) quelque peu énigmatique.

Pour moi, j'ai dû ajouter le chemin où se trouve stdio.h (comme @ardnew l'a dit). Dans Eclipse, vous ouvrez les Propriétés de votre projet, développez "C / C ++ General" et sélectionnez "Paths and Symbols".

Assurez-vous d'avoir ajouté le includerépertoire de chaque langue que vous utilisez. (Dans mon cas, je devais simplement l'ajouter à GNU C ++.)

entrez la description de l'image ici

aaaidan
la source
C'est étrangement proche de ce dont j'avais besoin! Juste eu à changer le nom d'utilisateur dans le chemin.
Lucas
2
Sous OS X, vous devrez peut-être installer manuellement les outils de développement de ligne de commande (qui nécessitent d'abord l'installation de Xcode) à l'aide de la commande /usr/bin/xcode-select --install, puis vous pourrez pointer Eclipse sur/usr/include/
RobV
1
Sur Yosemite. Utilisation d'Eclipse Juno. Cela a fonctionné pour moi, sauf que le chemin que j'avais donné était un peu différent (/ Users / SrinivasanNatarajan / android-ndk / plates-formes / android-19 / arch-arm / usr / include). Même si toutes les erreurs non résolues ont disparu, j'ai toujours un doute sur le fait que «ai-je défini le bon chemin». "Eclipse est vraiment nul". J'ai dû passer des heures pour configurer l'EDI pour le développement.
Srinivasan N
1
Merci. Seule votre variante m'a aidé.
Nikmoon
Dans mon cas (avec MinGW), utilisé "Système de fichiers ..." pour ajouter le répertoire "C: \ MinGW \ include"
Gary99
17

en ajoutant simplement à la base de connaissances, je viens de le faire sur win7 avec cygwin.

c'est ce qui semble fonctionner pour moi.

inclure des chemins pour c:

D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include
D:\dev\cygwin\usr\include

inclure des chemins pour c ++:

D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include
D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include\c++
D:\dev\cygwin\usr\include

cela me donne une compilation propre de bonjour le monde.

Ray Tayek
la source
Je viens du futur. Je suis venu vous dire merci. C'est en fait la première chose qui a fonctionné pour moi. Je n'ai jamais eu un monde si difficile. Merci Monsieur.
nVentimiglia
17

Accédez à Projet> Propriétés> Général C / C ++> Le préprocesseur comprend> Fournisseurs et sélectionnez les deux:

  • "Paramètres du compilateur intégré CDT GCC"
  • "Paramètres du compilateur intégré CDT CROSS GCC"

Pour chacun de ceux-ci, sélectionnez également la sous-entrée: "Utiliser le fournisseur global partagé entre les projets".

Testé sur Eclipse 4.8.0 dans Ubuntu 16.04 avec un C et un C ++ hello world.

Mike B
la source
3
... et cochez la case "Utiliser le fournisseur global partagé entre les projets"
Urhixidur
J'ai dû également cocher la case "Utiliser le fournisseur global partagé entre les projets" comme @Urhixidur l'a mentionné. J'ai essayé un grand nombre de solutions à cette erreur d'éclipse intégrée et c'est celle qui a réellement fonctionné pour moi. Ces lignes étaient ennuyeuses. Merci!
CodeGuyRoss du
10
  • Sélectionnez Fichier >> Nouveau projet
  • Dans l'assistant de projet, sélectionnez C / C ++ >> Projet C ++
  • Dans la section "Type de projet", sélectionnez " Projet Makefile >> Projet C ++ Hello world "
  • Dans la section "Toolchains", sélectionnez " Linux GCC "

Cela peut résoudre le problème. (Excusez-moi pour le mauvais anglais)

Nader Aryabarzan
la source
1
J'ai fait ces choses, mais il n'a toujours pas reconnu que les en-têtes sont dans / usr / include.
cardiff space man
Beaucoup plus facile que d'ajouter chacun d'entre eux. J'ai utilisé l'option cross plattform, qui fonctionnait également bien (sur Ubuntu)
panmari
Très utile! Excellent anglais.
AturSams
Comment faites-vous cela sur un projet existant?
Jay Elston
4

J'utilise Eclipse avec Cygwin et cela a fonctionné pour moi:

Allez dans Projet> Propriétés> C / C ++ Général> Le préprocesseur inclut ...> Fournisseurs et sélectionnez "Paramètres du compilateur intégré CDT GCC Cygwin [Partagé]".

superm0
la source
4

Je travaille avec plusieurs configurations de compilateurs croisés , où je dois utiliser différents emplacements pour les fichiers d'en-tête STD (et d'autres variables d'environnement).

La solution était de configurer l'indexeur pour qu'il utilise la configuration active.
Malheureusement, en raison d'un bogue dans eclipse , l'option n'est pas stockée localement, vous devez donc utiliser la configuration de l' espace de travail si vous souhaitez enregistrer la configuration lorsque vous ouvrez à nouveau eclipse.

Fenêtre -> Préférences -> C / C ++ -> Indexeur -> Utiliser la configuration de construction active

Cela obligera eclipse à utiliser le bon compilateur défini avec la configuration Cross GCC active du projet.

Yochai Timmer
la source
Eu le même problème, la compilation croisée vers ESP8266. Dommage que cette page soit si encombrée, j'ai dû le découvrir moi-même.
Michael Böckling
Merci pour ça. J'ai également développé ce problème après avoir créé plusieurs configurations de compilateur croisé (pour différentes versions du SDK intégré ESP32 "ESP-IDF"). Les en-têtes corrects n'étaient pas détectés par l'indexeur. Ce paramètre semble permettre à l'indexeur d'utiliser le même environnement que la configuration active, ce qui, dans mon cas, lui a permis de sélectionner les bons en-têtes.
davidA
3

Comme le notent les principales réponses, il est nécessaire de spécifier où se trouvent les dossiers de construction, qui peuvent être ajoutés via une boîte de dialogue accessible en cliquant avec le bouton droit sur le projet et en sélectionnant Propriétés-> C / C ++ Général-> Chemins et symboles.

La question restante est de savoir quels chemins doivent être ajoutés.

Si vous avez configuré correctement gcc pour l'accès en ligne de commande et que vous avez besoin de savoir quels sont les chemins d'inclusion par défaut qu'il utilise, demandez-le simplement; selon la langue qui vous intéresse, utilisez:

gcc -x c -v -E /dev/null
gcc -x c++ -v -E /dev/null

... cela listera les paramètres par défaut du compilateur qui sont utilisés lors de l'appel de gcc (et cette commande fonctionne également si "gcc" est vraiment un alias pour clang, comme sur OSX).

/dev/null est utilisé comme un fichier vide - nous demandons à gcc d'analyser un fichier vide

-x <language> spécifie la langue à compiler, nécessaire car nous n'utilisons pas de fichier avec une extension qui spécifie la langue

-v sortie détaillée, qui inclut la sortie des chemins d'inclusion

-E effectuer uniquement le prétraitement, afficher le fichier prétraité (cela empêche gcc de se plaindre qu'un fichier vide ne se compile pas correctement)

Vers le bas se trouve la liste des répertoires d'inclusion:

#include "..." search starts here:
#include <...> search starts here:
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks (framework directory)
End of search list.

Si vous entrez les répertoires répertoriés ici, dans l'ordre indiqué, dans la boîte de dialogue des chemins et symboles d'Eclipse, Eclipse CDT devrait être en mesure de trouver les en-têtes standard, et peut-être quelques en-têtes supplémentaires spécifiques à votre système d'exploitation.

(Merci à la réponse de devnull à une question connexe.)

Théodore Murdock
la source
TRÈS utile en effet.
sancho.s ReinstateMonicaCellio
1

Dans ADT, j'ai fait ce qui suit:

  1. faites un clic droit sur le projet et sélectionnez Propriétés
  2. développez C / C ++ Général et sélectionnez Préprocesseur Inclure les chemins, les macros, etc.
  3. sélectionner les entrées de réglage utilisateur CDT
  4. sélectionnez Ajouter ... dans le menu de droite
  5. Dans le répertoire d'inclusion, changez le chemin du projet en chemin du système de fichiers
  6. Accédez au répertoire qui contient vos fichiers d'inclusion
  7. remuer et répéter au besoin
user330844
la source
1

Normalement, Eclipse devrait être capable de résoudre automatiquement les fichiers d'inclusion standard. Il le fait en appelant gcc et en demandant sa configuration. Très probablement, Eclipse ne trouve pas votre gcc (ou du moins pas la version que vous utilisez pour la compilation).

Au lieu de spécifier tous les chemins d'inclusion standard dans les paramètres du projet, vous voudrez probablement vous assurer qu'Eclipse trouve gcc. Ajoutez le répertoire où se trouve gcc à la variable d'environnement PATH avant de démarrer Eclipse.

Si vous souhaitez que différents projets utilisent différents compilateurs, vous pouvez modifier les options de découverte. Ceux-ci sont masqués par défaut, alors activez-les d'abord depuis Fenêtre> Préférences> C / C ++> Paramètres des pages de propriétés> Afficher la page "Options de découverte". Ensuite, vous pouvez les trouver sous C / C ++ Build> Options de découverte dans les propriétés du projet.

Seppo Enarvi
la source
1

J'utilise l'IDE CodeWarrior basé sur eclipse pour les projets intégrés et je viens de résoudre ce problème en supprimant et en ajoutant à nouveau les adresses source aux propriétés du projet-> C / C ++ Général-> Chemin et Sybols-> Inclure les répertoires. Cela signifie qu'il y a beaucoup de raisons de prendre le message "Inclusion non résolue:" et qu'il y a aussi beaucoup de solution.

Enes Akyay
la source
0

Une erreur que j'ai eue lors de la configuration des chemins et des symboles est qu'au départ, j'ai configuré les chemins d'inclusion pour une langue différente. Je travaille avec CDT et Cygwin gnu C ++. Vous devez donc configurer les symboles et les chemins sous le langage GNU C ++.entrez la description de l'image ici

Rodolk
la source
0

Également mis ${COMMAND}à gccLinux

Sous:

  • Projet
  • Propriétés
  • Général C / C ++
  • Le préprocesseur inclut les chemins, les macros, etc.
  • Fournisseurs
  • Paramètres du compilateur intégré CDT GCC
  • Commande pour obtenir les spécifications du compilateur

Remplacer:

${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"

avec:

gcc -std=c99 -E -P -v -dD "${INPUTS}"

Si vous ne le faites pas, le stdout Eclipse affiche:

Unable to find full path for "-E"

et journaux sous ${HOME}/eclipse-workspace/.metadata/.logshow:

!ENTRY org.eclipse.cdt.core 4 0 2020-04-23 20:17:07.288
!MESSAGE Error: Cannot run program "-E": Unknown reason

car ${COMMAND} ${FLAGS}sont vides, et donc Eclipse essaie d'exécuter le -Esuivant.

Je me demande si nous pouvons bien définir le COMMANDetFLAGS variables sur les paramètres, mais j'ai essayé de les ajouter en tant que variables de construction et cela n'a pas fonctionné.

Version C ++ de la question: Comment résoudre "Inclusion non résolue: <iostream>" dans un fichier C ++ dans Eclipse CDT?

Testé sur Eclipse 2020-03 (4.15.0), Ubuntu 19.10 et ce projet Makefile minimal avec des sources existantes .

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
0

Vérifiez-vous s'il est compilé à partir de la ligne de commande? Pour moi aide sur Linux, apt installe libc-dev.

Jan B Noir
la source