Errore di "inclusione non risolta" con Eclipse CDT per le intestazioni della libreria standard C


96

Ho impostato CDT per eclipse e ho scritto un semplice programma in C hello world:

#include <stdio.h>

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

Il programma si compila e funziona correttamente, ma eclipse continua a mostrare questo punto interrogativo giallo accanto all'istruzione di inclusione che dice "Unresolved inclusion: <stdio.h>"quando ci metto il mouse sopra.

Non influisce sull'esecuzione del programma, ma lo trovo piuttosto fastidioso.

Qualcuno ha idea di come rimuoverlo?


2
Penseresti che l'esempio Hello World lo farebbe per te, o almeno ti fornirebbe un aiuto. Se eclipse non include un compilatore, perché non lo fa?
Doug Molineux

Risposte:


50

Il compilatore utilizzato da Eclipse è in grado di risolvere i simboli correttamente, quindi il codice verrà compilato correttamente.

Ma il completamento del codice / indicizzatore o il preprocessore che Eclipse sta usando non sa dove stdio.hesista.

È necessario specificare il percorso del file system in cui stdio.hsi trova.

La documentazione di Eclipse lo descrive in diverse sezioni per il compilatore:

E se anche il completamento del codice / indicizzatore o il preprocessore non è in grado di individuare stdio.h:

La posizione esatta di stdio.hdipenderà dal sistema per il quale si intende scrivere il codice. Se stai scrivendo codice per lo stesso sistema su cui stai eseguendo Eclipse, la posizione standard è /usr/include/stdio.hper Linux, macOS, Cygwin, ecc.

Se stai eseguendo la compilazione incrociata per un sistema di destinazione separato / remoto (ad esempio Android, Raspberry Pi, STM32), si troverà da qualche parte nell'SDK installato per quel sistema. Sarà necessario fare riferimento a quella particolare documentazione SDK.


2
Grazie per la risposta. Ma dov'è il percorso per Ubuntu 11.10?
Derrick Zhang

Una cosa che mi ha confuso è che ho dovuto aggiungere il percorso alla scheda "include", piuttosto che alla scheda "percorsi libreria". Ho sempre pensato che "anglebracket" include "libreria".
aaaidan

1
Si specifica dove trovare i file di intestazione (ad esempio i file .h) nella scheda include. Indica al linker dove può trovare i file di libreria compilati nella scheda del percorso della libreria. La convenzione delle virgolette e delle parentesi angolari dipende probabilmente dal compilatore, ma penso sempre a <> come se il significato guardasse prima nella posizione della libreria di sistema standard e "" come il significato che guardasse prima nel mio progetto.
Oggi

2
I compilatori moderni non fanno distinzione tra virgolette e parentesi angolari. Le intestazioni di sistema convenzionalmente standard sono ancora collocate tra parentesi angolari.
Seppo Enarvi

53

Ho trovato queste risposte (compresa quella accettata) alquanto criptiche.

Per me, ho dovuto aggiungere il percorso in cui si trova stdio.h (come ha detto @ardnew). In Eclipse, apri le proprietà del tuo progetto, espandi "C / C ++ General" e seleziona "Paths and Symbols".

Assicurati di aver aggiunto la includedirectory per ogni lingua che stai utilizzando. (Nel mio caso, dovevo semplicemente aggiungerlo a GNU C ++.)

inserisci qui la descrizione dell'immagine


Questo è stranamente vicino a ciò di cui avevo bisogno! Dovevo solo cambiare il nome utente nel percorso.
Lucas

2
Su OS X potresti dover installare manualmente gli strumenti per sviluppatori della riga di comando (che prima richiede l'installazione di Xcode) utilizzando il comando /usr/bin/xcode-select --installe poi sarai in grado di puntare Eclipse su/usr/include/
RobV

1
Su Yosemite. Utilizzando Eclipse Juno. Questo tipo di lavoro ha funzionato per me tranne che il percorso che avevo dato era leggermente diverso (/ Users / SrinivasanNatarajan / android-ndk / piattaforme / android-19 / arch-arm / usr / include). Anche se tutti gli errori irrisolti sono scomparsi, ho ancora il dubbio che "ho impostato il percorso corretto". "Eclipse fa davvero schifo". Ho dovuto passare ore per configurare l'IDE per lo sviluppo.
Srinivasan N

1
Grazie. Solo la tua variante mi ha aiutato.
Nikmoon

Nel mio caso (con MinGW), ho utilizzato "File system ..." per aggiungere la directory "C: \ MinGW \ include"
Gary99

17

aggiungendo solo alla knowledge base, l'ho appena fatto su win7 con cygwin.

questo è ciò che sembra funzionare per me.

include percorsi per c:

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

includere percorsi per c ++:

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

questo mi fa ottenere una compilazione pulita di ciao mondo.


Vengo dal futuro. Sono venuto per dirti grazie. Questa è in realtà la prima cosa che ha funzionato per me. Non ho mai avuto un mondo così difficile. Grazie Signore.
nVentimiglia

17

Vai a Progetto> Proprietà> C / C ++ Generale> Include preprocessore> Provider e seleziona entrambi:

  • "Impostazioni del compilatore integrato GCC CDT"
  • "Impostazioni del compilatore integrato CDT CROSS GCC"

Per ognuna di queste seleziona anche la sottovoce: "Usa provider globale condiviso tra progetti".

Testato su Eclipse 4.8.0 in Ubuntu 16.04 con un C e un C ++ hello world.


3
... e seleziona la casella "Usa provider globale condiviso tra progetti"
Urhixidur

Ho dovuto anche controllare "Usa provider globale condiviso tra progetti" come menzionato da @Urhixidur. Ho provato un gran numero di soluzioni a questo errore di eclissi integrato e questo è quello che ha effettivamente funzionato per me. Quelle linee erano fastidiose. Grazie!
CodeGuyRoss

10
  • Seleziona File >> Nuovo progetto
  • Nella Creazione guidata progetto, seleziona C / C ++ >> C ++ Project
  • Nella sezione "Tipo di progetto", seleziona " Progetto Makefile >> Progetto Hello world C ++ "
  • Nella sezione "Toolchain", seleziona " Linux GCC "

Può risolvere il problema. (Scusami per il cattivo inglese)


1
Ho fatto queste cose, ma ancora non ha riconosciuto che le intestazioni sono in / usr / include.
cardiff space man

Molto più facile che aggiungere ogni singolo include te stesso. Ho usato l'opzione cross-platform, che ha funzionato bene (su Ubuntu)
panmari

Molto utile! Ottimo inglese.
AturSams

Come si esegue questa operazione su un progetto esistente?
Jay Elston

4

Sto usando Eclipse con Cygwin e questo ha funzionato per me:

Vai su Progetto> Proprietà> Generale C / C ++> Include preprocessore ...> Provider e seleziona "Impostazioni del compilatore integrato GCC CDT Cygwin [Condiviso]".


4

Sto lavorando con più configurazioni cross compiler , in cui ho bisogno di utilizzare posizioni diverse per i file di intestazione STD (e altre variabili di ambiente).

La soluzione era impostare l'indicizzatore in modo che utilizzi la configurazione attiva.
Sfortunatamente a causa di qualche bug in eclipse , l'opzione non è memorizzata localmente, quindi devi usare la configurazione dell'area di lavoro se vuoi salvare la configurazione quando apri di nuovo eclipse.

Finestra -> Preferenze -> C / C ++ -> Indicizzatore -> Usa configurazione build attiva

In questo modo eclipse utilizzerà il compilatore corretto impostato con la configurazione Cross GCC attiva del progetto.


Ha avuto lo stesso problema, cross-compilazione a ESP8266. Peccato che questa pagina sia così affollata, ho dovuto capirlo da solo.
Michael Böckling

Grazie per questo. Ho anche riscontrato questo problema dopo aver creato più configurazioni cross-compiler (per diverse versioni dell'SDK incorporato ESP32 "ESP-IDF"). Le intestazioni corrette non venivano raccolte dall'indicizzatore. Questa impostazione sembra consentire all'indicizzatore di utilizzare lo stesso ambiente della configurazione attiva, che nel mio caso gli ha permesso di raccogliere le intestazioni corrette.
davidA

3

Come notano le risposte principali, è necessario specificare dove si trovano le cartelle di build, che possono essere aggiunte tramite una finestra di dialogo accessibile facendo clic con il pulsante destro del mouse sul progetto e selezionando Proprietà-> C / C ++ Generale-> Percorsi e simboli.

La domanda rimanente è quali percorsi devono essere aggiunti.

Se gcc è impostato correttamente per l'accesso dalla riga di comando e hai bisogno di sapere quali sono i percorsi di inclusione predefiniti che utilizza, chiedilo; a seconda della lingua che ti interessa, usa:

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

... questo elencherà le impostazioni predefinite del compilatore che vengono utilizzate quando si invoca gcc (e questo comando funziona anche se "gcc" è davvero un alias per clang, come su OSX).

/dev/null è usato come un file vuoto - stiamo dicendo a gcc di analizzare un file vuoto

-x <language> specifica la lingua da compilare, necessaria perché non stiamo utilizzando un file con un'estensione che specifica la lingua

-v output dettagliato, che include l'output dei percorsi di inclusione

-E esegue solo la preelaborazione, visualizza il file preelaborato (questo impedisce a gcc di lamentarsi del fatto che un file vuoto non viene compilato correttamente)

Verso il fondo sarà l'elenco delle directory di inclusione:

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

Se inserisci le directory elencate qui, nell'ordine elencato, nella finestra di dialogo dei percorsi e dei simboli di Eclipse, Eclipse CDT dovrebbe essere in grado di trovare le intestazioni standard e forse alcune intestazioni aggiuntive specifiche per il tuo sistema operativo.

(Grazie alla risposta di devnull a una domanda correlata.)


MOLTO utile davvero.
sancho.s ReinstateMonicaCellio

1

In ADT ho fatto quanto segue:

  1. fare clic con il tasto destro sul progetto e selezionare Proprietà
  2. espandere C / C ++ Generale e selezionare Preprocessore Includi percorsi, macro ecc.
  3. selezionare Voci impostazione utente CDT
  4. selezionare Aggiungi ... dal menu a destra
  5. In Add Include Directory cambia il percorso del progetto in percorso del file system
  6. Individua la directory che contiene i file di inclusione
  7. mescolare e ripetere se necessario

1

Normalmente, Eclipse dovrebbe essere in grado di risolvere automaticamente i file di inclusione standard. Lo fa chiamando gcc e chiedendo la sua configurazione. Molto probabilmente Eclipse non trova il tuo gcc (o almeno non la versione che usi per la compilazione).

Invece di specificare tutti i percorsi di inclusione standard nelle impostazioni del progetto, probabilmente vorrai assicurarti che Eclipse trovi gcc. Aggiungere la directory in cui si trova gcc alla variabile d'ambiente PATH prima di avviare Eclipse.

Se desideri che progetti diversi utilizzino compilatori diversi, potresti voler modificare le opzioni di rilevamento. Questi sono nascosti per impostazione predefinita, quindi abilitali prima da Finestra> Preferenze> C / C ++> Impostazioni pagine delle proprietà> Visualizza la pagina "Opzioni di rilevamento". Quindi puoi trovarli in C / C ++ Build> Opzioni di rilevamento nelle proprietà del progetto.


1

Sto usando l'IDE CodeWarrior basato su eclipse per progetti incorporati e ho appena risolto questo problema eliminando e aggiungendo di nuovo gli indirizzi di origine a Proprietà del progetto-> C / C ++ Generale-> Percorso e simboli-> Includi directory. Ciò significa che ci sono molte ragioni per accettare il messaggio "Inclusione non risolta:" e ci sono anche molte soluzioni.


0

Un errore che ho riscontrato durante la configurazione di Paths and Symbols è che inizialmente ho configurato i percorsi di inclusione per una lingua diversa. Sto lavorando con CDT e Cygwin gnu C ++. Quindi è necessario configurare simboli e percorsi nel linguaggio GNU C ++.inserisci qui la descrizione dell'immagine


0

Impostare anche ${COMMAND}per gccLinux

Sotto:

  • Progetto
  • Proprietà
  • C / C ++ Generale
  • Il preprocessore include percorsi, macro, ecc.
  • Fornitori
  • Impostazioni del compilatore integrato GCC CDT
  • Comando per ottenere le specifiche del compilatore

Sostituire:

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

con:

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

Se non lo fai, lo stdout di Eclipse mostra:

Unable to find full path for "-E"

e registri in ${HOME}/eclipse-workspace/.metadata/.logmostra:

!ENTRY org.eclipse.cdt.core 4 0 2020-04-23 20:17:07.288
!MESSAGE Error: Cannot run program "-E": Unknown reason

perché ${COMMAND} ${FLAGS}sono vuoti, quindi Eclipse cerca di eseguire quello -Eche viene dopo.

Mi chiedo se possiamo definire correttamente COMMANDeFLAGS variabili nelle impostazioni, ma ho provato ad aggiungerle come variabili di compilazione e non ha funzionato.

Versione C ++ della domanda: come risolvere "Inclusione non risolta: <iostream>" in un file C ++ in Eclipse CDT?

Testato su Eclipse 2020-03 (4.15.0), Ubuntu 19.10 e questo progetto Makefile minimo con sorgenti esistenti .


0

Controlli se si compila dalla riga di comando? Per me aiuta su Linux, apt installa libc-dev.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.