web-dev-qa-db-fra.com

Eclipse CDT montre des erreurs sémantiques, mais la compilation est correcte

J'ai installé Eclipse Indigo pour les développeurs Linux C/C++ sur Ubuntu 10.04 x86.

Lorsque j'utilise une macro prédéfinie commune __BASE_FILE__ Eclipse dit Symbol '__BASE_FILE__' could not be resolved, mais la compilation est OK. Je dois l'utiliser si souvent dans mon code et Eclipse remplit mon écran de lignes rouges et d'icônes de bugs :)

Comment puis-je réparer cela?

29
fasked

Je ne sais pas si cela résout votre problème spécifique, mais j'ai également eu des erreurs sémantiques. Ils sont sortis de nulle part après avoir eu un projet de travail.

Quoi qu'il en soit, je l'ai corrigé avec une seule option dans les paramètres de l'espace de travail en définissant: "Configuration de build pour l'indexeur: Utiliser la configuration de build active"

L'autre option était "Utiliser la configuration de construction spécifiée dans les paramètres de l'indexeur du projet" et c'est celle qui ne fonctionnait pas. Je pense qu'il a peut-être été corrompu après un crash Eclipse.

23
taloft

Fenêtre -> Préférences -> C/C++ -> Analyse de code -> Erreurs de syntaxe et sémantiques: OFF

Cela ne résoudra pas la cause du problème mais empêchera au moins l'affichage des fausses erreurs.

20
WindRider

Suppression du dossier .metadata, puis importation du projet.

Cette façon est OK!

5
Tanghuihua

La solution la plus simple consiste à réinitialiser l'indexeur:

Fenêtre/Préférences/C/C++/Indexer.
décochez "Activer l'indexeur" - >> OK
reconstruire tout, peut montrer beaucoup d'erreurs
cochez "Activer l'indexeur" - >> OK
reconstruisez tout

Cette erreur peut être produite par la fermeture forcée d'Eclipse par une panne de courant.

5
Zazun

Vous devez reconstruire l'index de votre projet.

Faites un clic droit sur le projet, puis sur Index-> ​​Reconstruire.

3
mczraf

Mise à jour: vous devez ajouter des chemins d'accès appropriés à Projet-> Propriétés-> C/C++ Général-> Chemins et symboles. Si cela n'aide pas, vous pouvez configurer Eclipse Code Analyzer (qui génère les "erreurs") dans Projet-> Propriétés-> C/C++ Général-> Analyse de code. Sous la description de l'erreur avec laquelle vous rencontrez un problème, essayez Personnaliser les modèles sélectionnés -> Portée -> Exclusion.

3
ondrisko

OMI, la bonne solution est de définir le symbole dans Projet -> Propriétés-> Général C/C++ -> Chemins et symboles -> onglet Symboles. Comme vous pouvez supposer que le symbole sera toujours fourni par le compilateur, vous dites simplement à Eclipse de le considérer comme défini.

J'ai eu le même problème récemment, où Eclipse se plaignait d'une macro non définie, que je fournis toujours en utilisant -D<MACRO_NAME> option de compilation.

3
compostus

Je pense que cela a quelque chose à voir avec l'espace de travail/.metadata. J'ai signalé le problème des erreurs sémantiques, mais Hello World compile et s'exécute. J'ai supprimé le projet, créé un autre, même rapport d'erreur. CDT réinstallé, même chose. Supprimé l'espace de travail, arrêté Eclipse, redémarré, créé un nouveau monde bonjour, même chose. Supprimez à nouveau l'espace de travail, arrêtez à nouveau Eclipse, cette fois, vous remarquerez qu'Eclipse avait recréé le dossier de l'espace de travail lors de l'arrêt alors qu'il ne le trouvait pas. Supprimé l'espace de travail avec Eclipse arrêté. Redémarrage d'Eclipse, création du projet HW, les erreurs s'affichent pendant environ une seconde, puis disparaissent. Projet supprimé, créé un autre, les erreurs s'affichent pendant une seconde, puis pouf. Si vous aviez réellement des projets dans votre espace de travail (le mien était une installation propre), je parie que vous pouvez simplement supprimer le dossier .metadata dans l'espace de travail, et cela le corrigerait.

3
sidney_h

Personnellement, je suis d'accord avec la réponse de compostus.

Il est bon de résoudre le vrai problème de l'analyseur de code d'Eclipse.

Mais quand j'essaie ces étapes: définir le symbole dans Projet -> Propriétés-> C/C++ Général -> Chemins et symboles

Je ne trouve pas d'onglet de symbole ou aucun endroit pour ajouter un symbole. ce que je veux faire, c'est mettre des macros comme -DANDROID ou #define Android 1 dans Eclipse pour que l'analyseur de code puisse trouver cette définition.

Je suis sous Mac OSX Mountain Lion.

1
fluke

en ajoutant une autre réponse, j'espère que cela aidera quelqu'un.

J'ai un ~ simple espace de travail (1 objet partagé c ++ (version linux d'une DLL, 3 exécutables c ++ et un pydev python)

J'ai vérifié tout le code sur une nouvelle machine, et cela fonctionne bien, mais il y avait de nombreuses "erreurs sémantiques" sur le code std-c et std-C++ et inclut .. J'ai parcouru tous les paramètres de découverte/indexation en vain.

==> la suppression de l'intégralité du dossier .metadata a résolu ce problème.

Comme je n'avais rien mis en place dans l'espace de travail (tous dans les fichiers/makefiles du projet), Eclipse a heureusement créé un nouvel espace de travail, et j'ai simplement dû faire un fichier-> importer-> projets existants

1
mike

Si sur Ubuntu, allez dans Fenêtre> Préférences> Dans la zone de recherche, tapez "Indexeur"> Sélectionnez Indexeur dans la colonne de gauche. Sous le titre "Options de l'indexeur", cochez les options suivantes (toutes sauf celles impliquant le saut de fichiers):

  • Fichiers source des fichiers d'index non inclus dans le projet
  • Indexer les en-têtes inutilisés Indexer toutes les variantes d'en-tête
  • Index des fichiers source et en-tête ouverts dans l'éditeur
  • Autoriser la résolution heuristique des inclusions

Sous la rubrique "Stratégie d'indexation", cochez les deux options qui sont:

  • Mettre à jour automatiquement l'index
  • Mettre à jour l'index immédiatement après chaque sauvegarde de fichier

Sous l'en-tête "Build Configuration for the indexer", sélectionnez l'option suivante:

  • Configuration de construction active de l'utilisateur
0
danielbker

J'ai eu un problème similaire mais ma compilation était correcte mais Eclipse a montré des erreurs sur les lignes qui utilisaient un #define d'un autre fichier include. J'ai corrigé en cochant "Indexer toutes les variantes d'en-tête". Je pense que le classis #ifndef NOM DE FICHIER dans le fichier include a été traité plusieurs fois dans Indexer et donc la 2e fois le NOM DE FICHIER a été défini de sorte que toutes les # définitions du fichier .h n'étaient pas "vues" par le préprocesseur. Aller à la fenêtre | Préférences | C/C++ | Indexeur.

0
Scott

Je ne sais pas si cela fonctionne pour le problème des OP, mais j'ai eu des erreurs sémantiques dans Eclipse Luna et j'ai pu les résoudre en suivant les instructions de ce fil: Eclipse montre une inclusion non résolue mais il compile

Le compilateur trouve l'en-tête, mais pas Eclipse.

Vous pouvez aider Eclipse et définir le chemin d'accès aux fichiers d'en-tête sous:

Projet -> Propriétés -> Build C/C++ -> Paramètres -> Compilateur -> Comprend

Dans ma situation, Eclipse avait déterminé l'un de mes répertoires d'inclusion, mais n'a pas déterminé qu'il y avait des répertoires de sous-inclusion à l'intérieur.

0
ams

J'ai utilisé # pragma une fois dans mon code. Cette configuration m'a causé le problème:

--- fileA.h ---

#pragma once
#define MYMACRO(X) func(X)

--- fileB.h ---

#include "fileA.h"

--- fileB.cpp ---

#include "fileB.h"

MYMACRO(5)  <---- warning here

J'ai remplacé #pragma une fois par #ifndef #define HEADER_FILE_H #endif, et cela a résolu le problème.

0
Denis Shchepetov

Il s'agit d'un problème d'indexation des fichiers.

Solution - Faites un clic droit sur le projet, Index-> ​​Rafraîchir tous les fichiers.

(S'applique à Eclipse CDT.Oxygen)

0
George Eliozov

Le problème se produit de cette façon: j'insère un nouveau nom de variable dans le code quelque part, par ex. "newone" dans cet exemple:

int a;

foo()
{
  a=17;
  newone=23;
}

Le fichier est enregistré (donc l'indexeur est réindexé). J'ai ensuite ajouté la définition:

int a, newone;

foo1()
{
  newone=0;
}


foo()
{
  a=17;
  newone=23;
}

L'indexeur affichera toujours l'erreur sur la ligne "newone = 23;" mais pas aux autres lignes de code contenant "newone".

Solution: définissez d'abord vos variables, puis utilisez-les.

M.

0
leonix

essaye ça:

Préférences -> c/c ++ -> Indexeur -> Indexer toutes les variantes d'en-tête

cochez cette option.

0
user245225