Seltsame Trennung zwischen Eclipse CDT, enthaltenen Systemheadern und dem zugrunde liegenden C-Build

9

Ich habe ein seltsames Problem mit Include-Dateien und einer offensichtlichen Trennung zwischen dem Build-Prozess von Eclipse und der Fehlermeldung. Ich gebe detaillierte Schritte zur Reproduktion dieses Problems, damit wir die Ursachen so schnell wie möglich eingrenzen können.

Eclipse 3.7.1 (Indigo SR1) für C / C ++ Linux Entwickler, Ubuntu 10.10 64-bit

Alles begann, als ich ein existierendes Projekt importierte, das von alleine gut "macht": Ich dachte Eclipse würde erheblich dabei helfen, die Dateien zu navigieren und herauszufinden, was was macht. Einige der Kopfzeilen #include d scheinen jedoch in Eclipse View nicht den richtigen Effekt zu haben. Das war sehr rätselhaft, und im Verlauf der Untersuchung gelang es mir, das Problem in einer winzigen Sandkiste nachzustellen.

Schritt eins: Erstellen Sie ein neues C-Projekt ( File: New: C Project ) mit dem Hello World ANSI C Project -Beispiel. Die Parameter sind Executable: Hello World ANSI C Project/Linux GCC , die verbleibenden Empty Projekte auf Linux GCC und GNU Autotools auf Hello World ANSI C Autotools Project . Nennen Sie es "Hallo". Achten Sie darauf, das Makefile automatisch zu generieren (Erweiterte Einstellungen, ich glaube, es ist der Standard).

Schritt zwei: Passen Sie den Include-Pfad an. Setzen Sie den Suchpfad mit Project: Properties: C/C++ General: Paths and Symbols: Includes: GNU C auf /usr/local/include , /usr/lib/gcc/x86_64-linux-gnu/4.4.5/include , /usr/include . Der zweite Pfad hängt von der genauen Version von gcc ab, die Sie installiert haben. Dies ist nicht so wichtig, solange der Build-Pfad mindestens /usr/include enthält.

Wenn Sie nun hello.c öffnen, sieht das sehr einfach aus, und Eclipse ist ziemlich glücklich, außer für return EXIT_SUCCESS; , das EXIT_SUCCESS nicht auflösen kann. Ersetzen Sie EXIT_SUCCESS durch eine Null ( 0 ) und Eclipse gibt die Entwarnung. Wählen Sie Project: Build Project , um die ausführbare Datei zu generieren.

Öffnen Sie ein Befehlszeilenfenster und führen Sie einen Drilldown in den Unterordner hello/Debug des Eclipse-Arbeitsbereichs durch. Dort können Sie die ausführbare Datei mit der Zeile ./hello ausführen.

Jetzt beginnt der Spaß. Ändere hello.c , um den letzten Teil zu lesen:

%Vor%

Sie erhalten einen Fehler in der Zeile int zz... : "Symbol 'SPLICE_F_MOVE' could not be resolved" . Wenn Sie das Projekt erstellen, erhalten Sie einen ähnlichen Fehler in der Konsolenansicht: "error: 'SPLICE_F_MOVE' undeclared" .

Wenn Sie jetzt die Präambel in:

ändern %Vor%

Sie noch erhalten den Fehler in der int zz -Zeile (im Editor), aber das Projekt wird korrekt erstellt! Sie können dies bestätigen, indem Sie die Binärdatei im zuvor geöffneten Befehlszeilenfenster ausführen. Das ist wirklich merkwürdig, da die Überprüfung von /usr/include/fcntl.h zeigt, dass es #include s <bits/fcntl.h> ist, und dass letzteres Header #define s SPLICE_F_MOVE (und ein paar andere) in einem Block von #ifdef __USE_GNU ( __USE_GNU bekommt #define d wenn _GNU_SOURCE ist #define d). Warum auf der Erde ist nicht unsere #define _GNU_SOURCE in der Perspektive des Arbeitsbereichs korrekt verbreitet?

Also das ist mein Problem in aller Kürze: Warum meldet der Editor (und das gesamte Eclipse CDT) einen Fehler (anscheinend durch die Weigerung, ein Include korrekt zu verarbeiten), aber dass der zugrunde liegende Build erfolgreich ist?

    
Urhixidur 30.11.2011, 22:29
quelle

3 Antworten

1

Ich hatte ähnliche Probleme bei der Arbeit mit GNU- und nicht-GNU-kompatiblen Toolchains, um verschiedene Mikrocontroller zu kompilieren. CDT meldet viele Fehler, aber die eigentliche Erstellung funktioniert einwandfrei, auch wenn alle Header-Include-Dateien in den Projekteinstellungen korrekt angeordnet sind.

Das Problem besteht darin, wie CDT im Gegensatz zu Ihrem make-System funktioniert. CDT ist ein eigenständiger Lexer, Parser und Präprozessor und nutzt nicht die Toolchain, die Sie für den Build verwenden. Dies würde normalerweise gut funktionieren, sobald Sie die Projekteinstellungen so eingestellt haben, dass sie mit den als Befehlszeilenargumente für Ihre Build-Tools erzeugten übereinstimmen, aber viele Toolchains enthalten häufig verborgene implizite Definitionen als Teil ihres Compilers / Präprozessors. Die Dokumentation für die implyT / hidden Definitionen ist meiner Erfahrung nach meist skizzenhaft und unvollständig, so dass es nahezu unmöglich ist zu bestimmen, welche Defines für eine bestimmte Toolchain gesetzt werden (manchmal sogar abhängig von den Build-Optionen) und was sie bedeuten. Obwohl es so aussehen mag, als ob Sie alle richtigen Definitionen haben, um den zu erreichen, mit dem Sie ein Problem haben, finde ich normalerweise (vor allem mit GNU), dass einige fehlen, die verhindern, dass der Switch so verarbeitet wird, wie Sie es tun erwartet.

Wenn ich etwas so debugge, stelle ich zuerst sicher, dass alle Header in meinem Projektverzeichnis zuerst gefunden werden, wenn sie Namen haben, die denen in anderen Verzeichnissen entsprechen, dann starte ich langsam Header aus dem Standard-Include-Ordner in meinen Projektordner. CDT zeigt nicht sehr gut an, welche möglichen Versionen einer Header-Datei zuerst analysiert werden, und häufig werden Systemumgebungseinstellungen abgerufen, wenn Sie es am wenigsten erwarten. In Ihrem Projektordner wird jedoch zuerst nach Kopfzeilen gesucht (wenn Sie Ports haben) Setzen Sie den System-Header-Pfad in Ihren Projekteinstellungen nicht auf Vorrang. Durch das Verschieben der System-Header von dem Standort, den Sie betrachten, in Ihr Projektverzeichnis wissen Sie genau, welche Header-Datei von CDT analysiert wird. Wenn Sie den Index nach dem Verschieben neu erstellen und dann die Datei in Eclipse öffnen, zeigt CDT an, welche Switches nach Ansicht des Benutzers aktiviert oder deaktiviert sind, indem die Zweige, die in der Kopfzeile nicht aktiviert sind, ausgegraut oder gefaltet werden. Das Folgen dieses Prozesses hat dieses genaue Problem für mich jedes Mal gelöst, aufdeckend, als ich Wege zu mehrfachen Kopien des gleichen Vorsatzes hatte, versehentlich doppelte Überschriften, hatte definiert oder schließt unter unerwarteten Umschaltungen ein, usw.

    
mtalexan 20.12.2013 23:16
quelle
0

Ich habe das gleiche Problem, aber ich habe nicht einmal etwas Kompliziertes gemacht - ich habe gerade ein Hallo-Welt-Projekt des Typs, den Sie beschreiben, gemacht und den gleichen Fehler bekommen. Beachten Sie jedoch, dass dies in meinem Fall möglicherweise auf eine fehlerhafte Installation von Cygwin zurückzuführen ist - zum Beispiel hatte ich andere Fehler in Bezug auf die fehlenden .h-Dateien und eine vollständige Löschung / Neuinstallation von Cygwin entfernte diese Fehler, aber der Fehler 'Symbol ... konnte nicht aufgelöst werden' bleibt bestehen.

Ich habe dann beschlossen, ein zweites Projekt zu erstellen, und beide melden einen solchen Fehler in der Ansicht "Probleme", aber nur eins der Projekte zeigt tatsächlich das Fehler unterstrichen usw. im Editor (!)

    
Adam Golding 11.02.2012 09:29
quelle
0

Vielleicht kommt dieses Problem von Ijndigo selbst. Hast du das gleiche mit dem neuesten Indigo SR2 versucht? Ich habe eine Reihe von Bugs für Indigo und seine SR1 in Eclipse Bugzilla geöffnet.

    
kirsche40 08.06.2012 18:31
quelle

Tags und Links