9
votes

Débranchement étrange entre Eclipse CDT, les en-têtes système inclus et la construction C sous-jacente

J'ai un problème étrange avec les fichiers incluant et une déconnexion apparente entre le processus de construction d'Eclipse et son rapport d'erreur. Je vais donner des étapes détaillées pour reproduire ce problème, afin que nous puissions réduire les causes aussi rapidement que possible.

Eclipse 3.7.1 (Indigo SR1) pour les développeurs C / C ++ Linux, Ubuntu 10.10 64 bits

Tout a commencé lorsque j'ai importé un projet existant qui "fait" tout va bien seul: je pensais que Eclipse aiderait considérablement à naviguer dans les dossiers et à déterminer ce que fait quoi. Cependant, certains des en-têtes système #include D ne semblaient pas avoir l'effet correct de la vue Eclipse. C'était très perplexe et, au cours de l'enquête sur cela, j'ai réussi à recréer le problème dans une boîte de sable minuscule.

Étape 1: Créez un nouveau projet C ( Fichier: Nouveau: Projet C ) Utilisation du projet Hello World ANSI C Project Sample. Les paramètres sont exécutables: Bonjour World ANSI C Project / Linux GCC , le reste Vider les projets définis sur Linux GCC et GNU AutoTools défini sur Bonjour World ANSI C Autotools Project . Appelez-le "Bonjour". Assurez-vous de générer le maquillage automatiquement (paramètres avancés, je pense que c'est la valeur par défaut).

Étape deux: ajustez le chemin Inclure. Utilisation de Projet: Propriétés: C / C ++ Généralités: Chemins et symboles: Inclus: GNU C , définissez le chemin de recherche sur / USR / local / Inclure , / usr /lib/gcc/x86_64-linux-gnu/4.4.5/include , / usr / include . Le deuxième chemin dépend de la version exacte de GCC que vous avez installée. Peu importe trop, tant que le chemin de construction inclut au moins / usr / include .

maintenant si vous ouvrez hello.c , il a l'air très simple et Eclipse est assez heureux, sauf pour return exit_success; , qui ne peut pas résoudre exit_success . Remplacer EXIT_SUCCESS avec un zéro ( 0 ) et Eclipse donne le tout clair. Sélectionnez Project: Créer le projet Pour générer l'exécutable.

Ouvrez une fenêtre de ligne de commande et expliquez-vous dans votre Bonjour / débogage de l'Eclipse Sous-dossier. Une fois là-bas, vous pouvez exécuter l'exécutable avec la ligne ./ bonjour .

Le plaisir commence maintenant. Modifier hello.c pour lire dans sa dernière partie: xxx

Vous obtiendrez une erreur sur le int zz ... < / Code> Ligne: "Symbole 'Splice_F_Move' n'a pas pu être résolu" . Si vous construisez le projet, vous obtiendrez une erreur similaire dans la vue de la console: "Erreur: 'Splice_f_move' non déclaré" non déclaré ".

Si vous changez le préambule à: < / p> xxx

vous toujours Obtenez l'erreur sur la ligne int zz (dans l'éditeur), mais le projet va construire correctement ! Vous pouvez le confirmer en exécutant le binaire dans la fenêtre de ligne de commande que vous avez ouverte plus tôt. C'est vraiment étrange depuis l'examen de /usr/inclufr/fcntl.h indiquera que #include s et ce dernier en-tête #define s splice_f_move (et un tas d'autres) dans un bloc gardé par #Ifdef __use_gnu ( __ usu_gnu obtient #define d si _gnu_source est #define d). Pourquoi sur Terre n'est-il pas notre #define _gnu_source correctement propagé dans la perspective de l'espace de travail?

C'est donc mon problème dans un mot: pourquoi est-ce l'éditeur (et tout Eclipse CDT) signale une erreur (apparemment en refusant de traiter correctement une inclusion), mais que la construction sous-jacente réussit?


1 commentaires

Avez-vous essayé de reconstruire l'index? Je crois que le CDT ne relève que des en-têtes externes si forcé et la première fois que l'en-tête est lu pour l'indexation qui inclut n'existe pas.


3 Réponses :


0
votes

J'ai le même problème, mais je n'ai même rien fait de ce qui compliquait de le produire - je viens de faire un projet World Hello du type que vous décrivez et obtenez la même erreur. Notez que, cependant, dans mon cas, il peut être dû à une installation de cygwin de bougwin - par exemple, j'avais d'autres erreurs concernant l'échec d'inclure les fichiers .h et une suppression complète / réinstallation de Cygwin supprimé ces erreurs , mais le «symbole ... ne pouvait pas être résolu» reste d'erreur.

J'ai alors décidé de faire un seconde de ce projet, et ils signalent tous les deux une telle erreur dans la vue "Problèmes", mais seulement un des projets montre réellement le erreur soulignée, etc. dans l'éditeur (!)


0 commentaires

0
votes

Peut-être que ce problème vient de Ijndigo même. Avez-vous essayé de la même chose avec le dernier Indigo SR2? J'ai ouvert un certain nombre de bugs pour Indigo et son SR1 dans Eclipse Bugzilla.


0 commentaires

1
votes

J'ai eu des problèmes similaires à travailler avec GNU et Tools à outils confidentiels non-GNU pour la compilation de divers microcontrôleurs. CDT rapporte de nombreuses erreurs, mais la construction réelle fonctionne parfaitement, même lorsque tout l'en-tête comprend correctement les paramètres du projet.

Le problème est dans la façon dont CDT fonctionne comme distinct de votre système de fabrication. CDT est un lexère, un analyseur et un préprocesseur autonome, et n'utilise pas la compagnie d'outils que vous utilisez pour faire la construction. Cela fonctionnerait normalement une fois que vous avez défini les paramètres du projet pour les adapter à ceux générés comme des arguments de ligne de commande à vos outils de construction, mais de nombreux outils d'outils incluent fréquemment des définitions implicites cachées dans le cadre de leur compilateur / préprocesseur lui-même. La documentation pour la définition impliquée / cachée est généralement sommaire et incomplète dans mon expérience, ce qui rend presque impossible de déterminer les définitions définies pour une boîte à outils donnée (parfois même dépendante des options de construction) et de ce qu'ils veulent dire. Bien que cela puisse sembler que vous avez toutes les définitions correctes réglées pour atteindre celui que vous rencontrez un problème, je trouve habituellement (surtout avec GNU) qu'il y en a des manques qui empêchent l'interrupteur d'être traitée comme vous attendu.

Lorsque j'ai débogué quelque chose comme ceci, je vous assure d'abord que tous les en-têtes de mon répertoire de projet se trouvent en premier si elles ont des noms correspondant à ceux d'autres répertoires, puis je commence lentement à déplacer les en-têtes de la norme Inclure le dossier dans mon dossier de projet. CDT ne fait pas de très bon travail d'indiquer quelles versions possibles d'un fichier d'en-tête, elle apporte d'abord des paramètres de l'environnement système lorsque vous vous y attendez le moins, mais il regarde dans votre dossier de projet pour les en-têtes d'abord (si vous le refus. 'T Définissez le chemin des en-têtes du système dans les paramètres de votre projet pour primer). En déplaçant les en-têtes système de l'emplacement que vous consultez votre répertoire de projet, vous savez certainement exactement quel fichier d'en-tête est analysé par CDT. En outre, si vous reconstruisez votre index après le déménagement, ouvrez le fichier dans Eclipse, CDT indiquera les commutateurs qu'il croit être activé ou désactivé en grisonnant ou en pliant les branches non activées dans l'en-tête. Suite à ce processus a résolu ce problème exactement pour moi à chaque fois, révélant lorsque j'avais des chemins vers plusieurs copies de la même en-tête, des en-têtes dupliqués accidentellement, avaient défini ou inclut des interrupteurs inattendus, etc.


0 commentaires