Fehler „Nicht aufgelöste Einbindung“ mit Eclipse CDT für C-Standardbibliotheksheader

Lesezeit: 7 Minuten

Benutzeravatar von Derrick Zhang
Derrick Zhang

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 weiterhin dieses gelbe Fragezeichen neben der Einschlussanweisung, die besagt "Unresolved inclusion: <stdio.h>" wenn ich die Maus drüber fahre.

Es hat keinen Einfluss auf den Ablauf des Programms, aber ich finde es ziemlich nervig.

Hat jemand eine Idee, wie man es entfernt?

  • Sie würden denken, dass das Hello World-Beispiel dies für Sie tun oder zumindest etwas Hilfe leisten würde. Wenn Eclipse keinen Compiler enthält, warum nicht?

    – Doug Molineux

    3. August 2012 um 21:07 Uhr

  • stackoverflow.com/questions/7905025/…

    – Vanuan

    22. Oktober 2012 um 10:07 Uhr

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). Öffnen Sie in Eclipse die Eigenschaften Ihres Projekts, erweitern Sie „C/C++ Allgemein“ und wählen Sie „Pfade und Symbole“ aus.

Stellen Sie sicher, dass Sie die hinzugefügt haben include dir für jede Sprache, die Sie verwenden. (In meinem Fall musste ich es einfach zu GNU C++ hinzufügen.)

Screenshot des Eclipse-Dialogs „Projekteigenschaften“ mit ausgewählter Option „Pfade und Symbole“.  Ein Dialog "Verzeichnispfad hinzufügen" wird eingeblendet.

  • Das ist unheimlich nah an dem, was ich brauchte! Musste nur den Benutzernamen im Pfad ändern.

    – Lukas

    8. Oktober 2013 um 8:26 Uhr

  • Unter OS X müssen Sie möglicherweise die Befehlszeilen-Entwicklertools (für die zuerst die Installation von Xcode erforderlich ist) mithilfe des Befehls manuell installieren /usr/bin/xcode-select --install und dann können Sie auf Eclipse zeigen /usr/include/

    – RobV

    15. April 2014 um 22:24 Uhr

  • Auf Yosemite. Verwenden von Eclipse Juno. Diese Art hat für mich funktioniert, außer dass der Pfad, den ich angegeben hatte, etwas anders war (/Users/SrinivasanNatarajan/android-ndk/platforms/android-19/arch-arm/usr/include). Obwohl alle ungelösten Fehler verschwunden sind, habe ich immer noch Zweifel, ob ich den richtigen Pfad eingestellt habe. “Eclipse ist wirklich scheiße”. Musste Stunden damit verbringen, die IDE für die Entwicklung einzurichten.

    – Srinivasan N

    1. April 2015 um 10:22 Uhr


  • Vielen Dank. Nur deine Variante hat mir geholfen.

    – Nikmoon

    20. Dezember 2016 um 9:18 Uhr

  • In meinem Fall (mit MinGW) wurde “Dateisystem …” verwendet, um das Verzeichnis “C:\MinGW\include” hinzuzufügen.

    – Gary99

    4. Januar 2018 um 15:54 Uhr

Benutzeravatar von ardnew
neu

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

Aber die Codevervollständigung/der Indexer oder Präprozessor, den Eclipse verwendet, weiß nicht, wo stdio.h existiert.

Sie müssen den Dateisystempfad angeben, wo stdio.h befindet sich.

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

Und wenn der Code-Completion/Indexer oder Präprozessor speziell auch nicht lokalisieren kann stdio.h:

Die genaue Lage von stdio.h hä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, dann ist der Standardspeicherort /usr/include/stdio.h für Linux, macOS, Cygwin usw.

Wenn Sie für ein separates/entferntes Zielsystem (z. B. Android, Raspberry Pi, STM32) crosskompilieren, 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.

  • Danke für die Antwort. Aber wo ist der Pfad für Ubuntu 11.10?

    – Derrick Zhang

    18. Februar 2012 um 2:23 Uhr

  • Eine Sache, die mich verwirrte, war, dass ich den Pfad zur Registerkarte “Enthält” und nicht zur Registerkarte “Bibliothekspfade” hinzufügen musste. Ich dachte immer, dass “Winkelklammer” beinhaltet “Bibliothek” beinhaltet.

    – aaaidan

    7. Juli 2012 um 5:24 Uhr

  • Auf der Registerkarte “Includes” geben Sie an, wo Header-Dateien (dh .h-Dateien) zu finden sind. Sie teilen dem Linker auf der Registerkarte Bibliothekspfad mit, wo er kompilierte Bibliotheksdateien finden kann. Die Konvention von Anführungszeichen und spitzen Klammern ist wahrscheinlich vom Compiler abhängig, aber ich denke immer, dass <> zuerst in der Standardsystembibliothek suchen und “” zuerst in meinem Projekt suchen bedeutet.

    – Tod

    26. Juli 2012 um 5:17 Uhr


  • Moderne Compiler unterscheiden nicht zwischen Anführungszeichen und spitzen Klammern. Herkömmlicherweise werden Standard-Systemköpfe immer noch in spitze Klammern gesetzt.

    – Seppo Enarvi

    13. August 2012 um 8:54 Uhr

Benutzeravatar von Mike B
Mike B

Gehen Sie zu Project > Properties > C/C++ General > Preprocessor Includes > Providers und wählen Sie beide aus:

  • “CDT GCC Built-in Compiler-Einstellungen”
  • “CDT CROSS GCC Built-in Compiler-Einstellungen”

Wählen Sie für jeden davon auch den Untereintrag: “Use global provider shared between projects”.

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

  • … und aktivieren Sie das Kontrollkästchen “Globalen Anbieter verwenden, der von Projekten gemeinsam genutzt wird”.

    – Urhixidur

    6. Dezember 2016 um 17:39 Uhr

  • Ich musste auch “Use global provider shared between projects” ü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

    26. September 2017 um 15:42 Uhr

Ich füge nur der Wissensdatenbank hinzu, ich habe dies gerade auf Win7 mit Cygwin gemacht.

das scheint bei mir 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 verschafft mir eine saubere Zusammenstellung von Hello World.

  • Auswählen Datei >> Neues Projekt
  • Wählen Sie im Projektassistenten aus C/C++>> C++-Projekt
  • Wählen Sie im Abschnitt „Projekttyp“ „Makefile-Projekt >> Hallo Welt C++-Projekt
  • Wählen Sie im Abschnitt “Toolchains” “Linux-GCC

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

  • Ich habe diese Dinge getan, aber es hat immer noch nicht erkannt, dass sich die Header in /usr/include befinden.

    – Cardiff-Weltraummann

    27. Januar 2013 um 21:37 Uhr

  • Viel einfacher, als jedes einzelne Include selbst hinzuzufügen. Ich habe die plattformübergreifende Option verwendet, die auch gut funktioniert hat (unter Ubuntu)

    – panmari

    3. Mai 2013 um 12:56 Uhr

  • Sehr hilfreich! Tolles Englisch.

    – AturSams

    10. März 2016 um 15:42 Uhr

  • Wie macht man das bei einem bestehenden Projekt?

    – Jay Elston

    24. September 2018 um 16:58 Uhr

Benutzeravatar von superm0
superm0

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

Gehen Sie zu Project > Properties > C/C++ General > Preprocessor Includes… > Providers und wählen Sie „CDT GCC Built-in Compiler Settings Cygwin [Shared]”.

  • Ich habe diese Dinge getan, aber es hat immer noch nicht erkannt, dass sich die Header in /usr/include befinden.

    – Cardiff-Weltraummann

    27. Januar 2013 um 21:37 Uhr

  • Viel einfacher, als jedes einzelne Include selbst hinzuzufügen. Ich habe die plattformübergreifende Option verwendet, die auch gut funktioniert hat (unter Ubuntu)

    – panmari

    3. Mai 2013 um 12:56 Uhr

  • Sehr hilfreich! Tolles Englisch.

    – AturSams

    10. März 2016 um 15:42 Uhr

  • Wie macht man das bei einem bestehenden Projekt?

    – Jay Elston

    24. September 2018 um 16:58 Uhr

Ich arbeite mit mehrere Cross-Compiler-Konfigurationenwo ich verschiedene Speicherorte für die STD-Headerdateien (und andere Umgebungsvariablen) verwenden muss.

Die Lösung bestand darin, den Indexer so einzurichten, dass er die aktive Konfiguration verwendet.
Leider wegen einigen Fehler in Eclipsedie Option wird nicht lokal gespeichert, also müssen Sie die verwenden Arbeitsplatz configuration, wenn Sie die Konfiguration speichern möchten, wenn Sie Eclipse erneut öffnen.

Window -> Preferences -> C/C++ -> Indexer -> Use active build configuration

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

  • Hatte das gleiche Problem, Cross-Compiling zu ESP8266. Schade, dass diese Seite so voll ist, musste es selbst herausfinden.

    – Michael Böckling

    7. Mai 2016 um 12:35 Uhr

  • Danke dafür. Ich hatte dieses Problem auch, nachdem ich mehrere Cross-Compiler-Konfigurationen erstellt hatte (für verschiedene Versionen des eingebetteten ESP32-SDK „ESP-IDF“). Die richtigen Header wurden nicht vom Indexer erfasst. Diese Einstellung scheint es dem Indexer zu ermöglichen, dieselbe Umgebung wie die aktive Konfiguration zu verwenden, was es ihm in meinem Fall ermöglichte, die richtigen Header aufzunehmen.

    – davidA

    17. Januar 2018 um 2:32 Uhr


  • Ich habe diese Option aktiviert, aber sie behebt das Problem nicht. Eclipse ist total schizophren. Manchmal erhalte ich diese Fehler nicht, aber manchmal entscheidet es, dass ich überall unerkannte Überschriften und Symbole habe. Ich war noch nicht in der Lage, zu korrelieren, wann es auftritt und sich auf der Grundlage der von mir durchgeführten Aktionen löst, außer dass ich den Code ändere, speichere und neu aufbaue.

    – Schleicher

    25. März um 17:08 Uhr

1421580cookie-checkFehler „Nicht aufgelöste Einbindung“ mit Eclipse CDT für C-Standardbibliotheksheader

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy