Fehler "Ungelöste Aufnahme" mit Eclipse CDT für C-Standardbibliotheksheader

96

Ich habe CDT für Eclipse eingerichtet und ein einfaches Hallo-Welt-C-Programm geschrieben:

#include <stdio.h>

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

Das Programm wird korrekt erstellt und ausgeführt, aber Eclipse zeigt dieses gelbe Fragezeichen neben der Einschlussanweisung an, die besagt, "Unresolved inclusion: <stdio.h>"wenn ich mit der Maus darüber fahre.

Es hat keinen Einfluss auf die Ausführung des Programms, aber ich finde es ziemlich nervig.

Hat jemand eine Idee, wie man es entfernt?

Derrick Zhang
quelle
2
Sie würden denken, dass das Hello World-Beispiel dies für Sie tun oder zumindest etwas Hilfe bieten würde. Wenn Eclipse keinen Compiler enthält, warum nicht?
Doug Molineux

Antworten:

50

Der von Eclipse verwendete Compiler kann die Symbole einwandfrei auflösen, sodass der Code einwandfrei kompiliert wird.

Der von Eclipse verwendete Code-Vervollständigungs- / Indexer oder Präprozessor weiß jedoch nicht, wo er stdio.hvorhanden ist.

Sie müssen den Dateisystempfad angeben, in dem sich der Pfad stdio.hbefindet.

Die Eclipse-Dokumentation beschreibt dies in mehreren Abschnitten für den Compiler:

Und wenn der Code-Vervollständiger / Indexer oder Präprozessor speziell auch nicht finden kann stdio.h:

Der genaue Speicherort stdio.hhängt von dem System ab, für das Sie den Code schreiben möchten. Wenn Sie Code für dasselbe System schreiben, auf dem Sie Eclipse ausführen, ist der Standardspeicherort /usr/include/stdio.hLinux, MacOS, Cygwin usw.

Wenn Sie für ein separates / Remote-Zielsystem (z. B. Android, Raspberry Pi, STM32) Cross-Compilieren, befindet es sich irgendwo in dem SDK, das Sie für dieses System installiert haben. Sie müssen sich auf diese spezielle SDK-Dokumentation beziehen.

ardnew
quelle
2
Danke für die Antwort. Aber wo ist der Weg für Ubuntu 11.10?
Derrick Zhang
Eine Sache, die mich verwirrte, war, dass ich den Pfad zur Registerkarte "Includes" und nicht zur Registerkarte "Bibliothekspfade" hinzufügen musste. Ich habe immer gedacht, dass "Anglebracket" enthält, wo "Bibliothek" enthält.
aaaidan
1
Auf der Registerkarte Includes legen Sie fest, wo sich Header-Dateien (dh .h-Dateien) befinden. Sie teilen dem Linker mit, wo er kompilierte Bibliotheksdateien auf der Registerkarte Bibliothekspfad finden kann. Die Konvention von Anführungszeichen und spitzen Klammern ist wahrscheinlich vom Compiler abhängig, aber ich denke immer an <> als Bedeutung, die zuerst in der Standard-Systembibliothek angezeigt wird, und "" als Bedeutung, die zuerst in meinem Projekt angezeigt wird.
Tod
2
Moderne Compiler unterscheiden nicht zwischen Anführungszeichen und spitzen Klammern. Herkömmliche Standard-System-Header werden weiterhin in spitzen Klammern platziert.
Seppo Enarvi
53

Ich fand diese Antworten (einschließlich der akzeptierten) etwas kryptisch.

Für mich musste ich den Pfad hinzufügen, in dem sich stdio.h befindet (wie @ardnew sagte). In Eclipse öffnen Sie die Eigenschaften Ihres Projekts, erweitern "C / C ++ General" und wählen "Pfade und Symbole".

Stellen Sie sicher, dass Sie das includeVerzeichnis für jede von Ihnen verwendete Sprache hinzugefügt haben . (In meinem Fall musste ich es nur zu GNU C ++ hinzufügen.)

Geben Sie hier die Bildbeschreibung ein

aaaidan
quelle
Dies ist unheimlich nah an dem, was ich brauchte! Musste nur den Benutzernamen im Pfad ändern.
Lucas
2
Unter OS X müssen Sie möglicherweise die Befehlszeilen-Entwicklertools (für die zuerst Xcode installiert werden muss) mithilfe des Befehls manuell installieren. /usr/bin/xcode-select --installAnschließend können Sie Eclipse auf/usr/include/
RobV
1
Auf Yosemite. Verwenden von Eclipse Juno. Diese Art funktionierte für mich, außer dass der Pfad, den ich angegeben hatte, etwas anders war (/ Users / SrinivasanNatarajan / android-ndk / platform / android-19 / arch-arm / usr / include). Obwohl alle ungelösten Fehler verschwunden sind, habe ich immer noch Zweifel, ob ich den richtigen Weg eingeschlagen habe. "Eclipse ist wirklich scheiße". Musste Stunden verbringen, um die IDE für die Entwicklung einzurichten.
Srinivasan N
1
Vielen Dank. Nur deine Variante hat mir geholfen.
Nikmoon
In meinem Fall (mit MinGW) verwendet "Dateisystem ...", um das Verzeichnis "C: \ MinGW \ include"
hinzuzufügen
17

Ich habe gerade die Wissensdatenbank erweitert und dies auf Win7 mit Cygwin gemacht.

Das scheint für mich zu funktionieren.

Pfade für c einschließen:

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

Pfade für c ++ einschließen:

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

Das bringt mir eine saubere Zusammenstellung von Hallo Welt.

Ray Tayek
quelle
Ich bin aus der Zukunft. Ich bin gekommen, um Danke zu sagen. Dies ist eigentlich das erste, was für mich funktioniert hat. Ich hatte noch nie eine so schwierige Hallo-Welt. Danke mein Herr.
NVentimiglia
17

Gehen Sie zu Projekt> Eigenschaften> C / C ++ Allgemein> Präprozessor-Includes> Anbieter und wählen Sie beide aus:

  • "CDT GCC integrierte Compiler-Einstellungen"
  • "CDT CROSS GCC Integrierte Compiler-Einstellungen"

Wählen Sie für jeden von ihnen auch den Untereintrag aus: "Globalen Anbieter verwenden, der von Projekten gemeinsam genutzt wird".

Getestet auf Eclipse 4.8.0 in Ubuntu 16.04 mit einer C- und einer C ++ - Hallo-Welt.

Mike B.
quelle
3
... und
aktivieren Sie das
Ich musste auch den "Globalen Anbieter verwenden, der von Projekten gemeinsam genutzt wird" überprüfen, wie @Urhixidur erwähnte. Ich habe eine große Anzahl von Lösungen für diesen eingebauten Eclipse-Fehler ausprobiert, und dies ist diejenige, die tatsächlich für mich funktioniert hat. Diese Zeilen waren nervig. Vielen Dank!
CodeGuyRoss
10
  • Wählen Sie Datei >> Neues Projekt
  • Wählen Sie im Projektassistenten C / C ++ >> C ++ - Projekt aus
  • Wählen Sie im Abschnitt "Projekttyp" die Option " Makefile-Projekt >> Hallo Welt C ++ - Projekt ".
  • Wählen Sie im Abschnitt "Toolchains" die Option " Linux GCC ".

Es kann das Problem lösen. (Entschuldigung für schlechtes Englisch)

Nader Aryabarzan
quelle
1
Ich habe diese Dinge getan, aber es wurde immer noch nicht erkannt, dass sich die Header in / usr / include befinden.
Cardiff Space Man
Viel einfacher als jedes einzelne Include selbst hinzuzufügen. Ich habe die Cross-Plattform-Option verwendet, die auch gut funktioniert hat (unter Ubuntu)
Panmari
Sehr hilfreich! Tolles Englisch.
AturSams
Wie machen Sie das bei einem bestehenden Projekt?
Jay Elston
4

Ich verwende Eclipse mit Cygwin und das hat bei mir funktioniert:

Gehen Sie zu Projekt> Eigenschaften> C / C ++ Allgemein> Präprozessor enthält ...> Anbieter und wählen Sie "Integrierte CDT GCC-Compilereinstellungen Cygwin [Shared]".

superm0
quelle
4

Ich arbeite mit mehreren Cross-Compiler-Konfigurationen , bei denen ich unterschiedliche Speicherorte für die STD-Header-Dateien (und andere Umgebungsvariablen) verwenden muss.

Die Lösung bestand darin, den Indexer so einzurichten, dass er die aktive Konfiguration verwendet.
Leider wird die Option aufgrund eines Fehlers in Eclipse nicht lokal gespeichert. Sie müssen daher die Arbeitsbereichskonfiguration verwenden, wenn Sie die Konfiguration speichern möchten, wenn Sie Eclipse erneut öffnen.

Fenster -> Einstellungen -> C / C ++ -> Indexer -> Aktive Build-Konfiguration verwenden

Dadurch verwendet Eclipse den richtigen Compiler, der mit der aktiven Cross GCC-Konfiguration des Projekts festgelegt wurde.

Yochai Timmer
quelle
Hatte das gleiche Problem beim Cross-Compilieren mit ESP8266. Schade, dass diese Seite so überfüllt ist, dass ich es selbst herausfinden musste.
Michael Böckling
Danke dafür. Dieses Problem trat auch auf, nachdem ich mehrere Cross-Compiler-Konfigurationen erstellt hatte (für verschiedene Versionen des eingebetteten ESP32-SDK "ESP-IDF"). Die richtigen Header wurden vom Indexer nicht erfasst. Diese Einstellung scheint es dem Indexer zu ermöglichen, dieselbe Umgebung wie die aktive Konfiguration zu verwenden, wodurch er in meinem Fall die richtigen Header abrufen konnte.
DavidA
3

Wie in den oberen Antworten angegeben, muss angegeben werden, wo sich die Build-Ordner befinden. Diese können über einen Dialog hinzugefügt werden, der durch Klicken mit der rechten Maustaste auf das Projekt und Auswahl von Eigenschaften-> C / C ++ Allgemein-> Pfade und Symbole erreicht wird.

Die verbleibende Frage ist, welche Pfade hinzugefügt werden müssen.

Wenn Sie gcc für den Befehlszeilenzugriff korrekt eingerichtet haben und wissen möchten, welche Standard-Include-Pfade verwendet werden, fragen Sie einfach danach. Verwenden Sie je nach der Sprache, an der Sie interessiert sind:

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

... hier werden die Standard-Compilereinstellungen aufgelistet, die beim Aufrufen von gcc verwendet werden (und dieser Befehl funktioniert auch, wenn "gcc" wirklich ein Alias ​​für clang ist, wie unter OSX).

/dev/null wird als leere Datei verwendet - wir weisen gcc an, eine leere Datei zu analysieren

-x <language> Gibt die Sprache an, als die kompiliert werden soll. Dies ist erforderlich, da keine Datei mit einer Erweiterung verwendet wird, die die Sprache angibt

-v Ausführliche Ausgabe, einschließlich der Ausgabe der Include-Pfade

-E Führen Sie nur eine Vorverarbeitung durch und geben Sie die vorverarbeitete Datei aus (dies verhindert, dass gcc sich darüber beschwert, dass eine leere Datei nicht korrekt kompiliert wird).

Unten wird die Liste der Include-Verzeichnisse angezeigt:

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

Wenn Sie die hier aufgeführten Verzeichnisse in der angegebenen Reihenfolge in das Dialogfeld "Pfade und Symbole" von Eclipse eingeben, sollte Eclipse CDT in der Lage sein, die Standardheader und möglicherweise einige zusätzliche Header zu finden, die für Ihr Betriebssystem spezifisch sind.

(Dank an Devnulls Antwort auf eine verwandte Frage.)

Theodore Murdock
quelle
Sehr nützlich in der Tat.
sancho.s ReinstateMonicaCellio
1

In ADT habe ich Folgendes getan:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Eigenschaften
  2. Erweitern Sie C / C ++ General und wählen Sie Preprozessor Include Paths, Macros usw.
  3. Wählen Sie CDT User Setting Entries
  4. Wählen Sie im rechten Menü Hinzufügen ... aus
  5. Ändern Sie im Verzeichnis "Include-Verzeichnis hinzufügen" den Projektpfad in den Dateisystempfad
  6. Navigieren Sie zu dem Verzeichnis, das Ihre Include-Dateien enthält
  7. rühren und nach Bedarf wiederholen
user330844
quelle
1

Normalerweise sollte Eclipse in der Lage sein, die Standard-Include-Dateien automatisch aufzulösen. Dazu ruft er gcc auf und fragt nach seiner Konfiguration. Höchstwahrscheinlich findet Eclipse Ihren gcc nicht (oder zumindest nicht die Version, die Sie zum Kompilieren verwenden).

Anstatt alle Standard-Include-Pfade in den Projekteinstellungen anzugeben, möchten Sie wahrscheinlich sicherstellen, dass Eclipse gcc findet. Fügen Sie das Verzeichnis, in dem gcc gefunden wird, zur Umgebungsvariablen PATH hinzu, bevor Sie Eclipse starten.

Wenn Sie möchten, dass verschiedene Projekte unterschiedliche Compiler verwenden, möchten Sie möglicherweise die Erkennungsoptionen optimieren. Diese sind standardmäßig ausgeblendet. Aktivieren Sie sie daher zuerst über Fenster> Einstellungen> C / C ++> Eigenschaftenseiteneinstellungen> Seite "Erkennungsoptionen" anzeigen. Sie finden sie dann unter C / C ++ Build> Erkennungsoptionen in den Projekteigenschaften.

Seppo Enarvi
quelle
1

Ich verwende Eclipse-basierte CodeWarrior-IDE für eingebettete Projekte und habe dieses Problem gerade gelöst, indem ich die Quelladressen gelöscht und erneut zu Project Properities-> C / C ++ General-> Path and Sybols-> Include Directories hinzugefügt habe. Dies bedeutet, dass es viele Gründe gibt, die Nachricht "Ungelöste Aufnahme:" zu verwenden, und dass es auch viele Lösungen gibt.

Enes Akyay
quelle
0

Ein Fehler beim Konfigurieren von Pfaden und Symbolen ist, dass ich anfangs die Include-Pfade für eine andere Sprache konfiguriert habe. Ich arbeite mit CDT und Cygwin Gnu C ++. Sie müssen also Symbole und Pfade in der Sprache GNU C ++ konfigurieren.Geben Sie hier die Bildbeschreibung ein

Rodolk
quelle
0

Auch setzen ${COMMAND}auf gccLinux

Unter:

  • Projekt
  • Eigenschaften
  • C / C ++ Allgemein
  • Präprozessor-Include-Pfade, Makros usw.
  • Anbieter
  • Integrierte CDT GCC-Compilereinstellungen
  • Befehl zum Abrufen der Compilerspezifikationen

Ersetzen:

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

mit:

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

Wenn Sie dies nicht tun, zeigt das Eclipse-Standard:

Unable to find full path for "-E"

und Protokolle unter ${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

weil ${COMMAND} ${FLAGS}leer sind, und so versucht Eclipse, die auszuführen-E , was als nächstes kommt.

Ich frage mich, ob wir das COMMANDund richtig definieren könnenFLAGS -Variablen in den Einstellungen können, aber ich habe versucht, sie als Build-Variablen hinzuzufügen, und es hat nicht funktioniert.

C ++ - Version der Frage: Wie löse ich "Ungelöste Aufnahme: <iostream>" in einer C ++ - Datei in Eclipse CDT?

Getestet auf Eclipse 2020-03 (4.15.0), Ubuntu 19.10 und diesem minimalen Makefile-Projekt mit vorhandenen Quellen .

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

Überprüfen Sie, ob es über die Befehlszeile kompiliert wurde? Für mich hilft unter Linux, apt libc-dev zu installieren.

Jan B Noir
quelle