2012-07-10 12 views
7

Recentemente ho cambiato da Eclipse 3.6 a Eclipse 3.7, che sto usando per lo sviluppo C++ in Ubuntu 11.04.Eclipse 3.7 non può risolvere i tipi in C++ Editor

Con la versione 3.6 non ho avuto grossi problemi, tranne che ho sempre avuto alcuni problemi con l'indicizzatore. Ora con la versione 3.7 inizia a contrassegnare i tipi non risolti come errori. Dal momento che l'indicizzatore sembra non gradirmi ancora di più, la mia Eclipse apparentemente non conosce tipi come uint16_t o size_t.

Al contrario degli errori visualizzati nell'editor di codice, il mio compilatore non ha problemi con la compilazione del codice e la risoluzione di tutti i simboli e tipi, quindi questo sembra essere un problema dell'IDE stesso.

Esistono modi per evitare questo comportamento, perché tutte le sottolineature rosse rendono il mio codice sempre più illeggibile ...?

Aggiornamento:

D'accordo con qualche ricerca e la risposta da Dennis ho scoperto che ho bisogno di aggiungere alcuni percorsi per Project Properties/ C/C++ General/ Paths and Symbols

Dal momento che sto costruendo per un PowerPC, invece di un obiettivo I32 , Non posso semplicemente aggiungere /usr/include. Invece avevo bisogno di aggiungere

/usr/powerpc-linux-gnu/libc/usr/include

per tutte le intestazioni standard (come stdint.h). Inoltre ho bisogno:

/usr/lib/gcc/powerpc-linux-gnu/4.5.1/include

per il stdarg.h.

Ora quasi tutti gli errori sono spariti. L'unica funzione che mi disturba ancora è printf dall'intestazione stdio.h. Ho cercato e il file di intestazione si trova all'interno dei percorsi inclusi. Ancora ricevo un errore che dice Function printf could not be resolved. Voglio sottolineare ancora, che questi sono solo degli errori mostrati da Eclipse - La compilazione stessa funziona bene.

Quindi questo in realtà getta fino 3 domande:

  1. nelle proprietà del progetto la sezione Paths and Symbols è coerente con i percorsi di inclusione fuori della sezione C++ Build/Settings/C++ Includes. Ciò significa che aggiungere/eliminare un percorso in una di queste sezioni influisce direttamente sulla voce degli altri. Dal momento che lo C++ Includes è direttamente coerente con il compilatore, mi chiedo perché il compilatore possa compilare correttamente (e trova le intestazioni) anche se non sono passati a lui come percorso? Esiste un tipo di percorso GCC standard, che non conosco?

  2. Perché non trova printf in eclissi? Il file di intestazione stdio.h è incluso e contiene anche la dichiarazione di printf - quindi perché l'editor di codice Eclipse mi dice che non può risolverlo?

  3. Perché i file di intestazione sono così divisi? Sono consapevole del fatto che ho bisogno di altri file di intestazione se sto creando un altro traget (ad esempio PowerPC) - Ma perché GNU GCC separa quelle intestazioni in diverse directory?

risposta

3

Le sottolineature rosse per tipi comuni sono in genere causate dal non avere la libreria standard nel percorso di inclusione. Guarda i tuoi include per il tuo progetto ... sono nelle proprietà del progetto. Assicurati che il tuo C++ includa una voce che corrisponda alle cartelle libs standard C++ per il compilatore che stai utilizzando.

+0

Sto usando il compilatore powerpc-linux-gnu-g ++. Nelle mie impostazioni di compilazione C++ ho anche configurato il percorso di inclusione ('/ usr/powerpc-linux-gnu/include/C++/4.5.1'). Questo percorso ho anche aggiunto ai percorsi Project Include ... purtroppo non cambia nulla. – Toby

+0

'size_t' è definito in' 'tra gli altri. Se # includi nel tuo file vedi se fa sparire le linee rosse. In caso contrario, vedere se il '#include ' è sottolineato con una linea gialla. In tal caso, passa il mouse sopra di esso e, se dice che non riesce a trovarlo, hai un problema con l'impostazione di inclusione. Prova anche a ricostruire l'indice per il tuo progetto. – Dennis

+0

Ciao Dennis, grazie per il tuo input - Ho appena aggiornato la domanda un po '. Forse puoi aiutarmi ulteriormente. – Toby

3

Dopo aver riscontrato questo problema e una ricerca che rivela due domande di overflow dello stack che hanno riscontrato lo stesso problema, ho pensato di inviare come l'ho risolto dopo che mi ha infastidito abbastanza da indagare effettivamente.

Sto eseguendo Fedora e fastidiosamente, ha un file stddef.h in/usr/include/linux .... che in realtà è vuoto. Quindi, anche se avevo il compilatore stddef.h nel percorso di inclusione, l'indicizzatore stava effettivamente analizzando questo altro file vuoto. Allora, cosa necessaria fatto era:

prefisso tuoi sentieri e simboli lista con il compilatore specifica include il percorso (nel mio caso è stato /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/) per evitare che l'altro stddef.h vuoto venga analizzato.

+0

è importante. Avevo /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/ incluso ma è in fondo e non può essere spostato verso l'alto. Ho dovuto aggiungere un'altra voce e spostarla in alto per farlo funzionare. Apparentemente altre directory nella lista hanno una versione sbagliata che incasina le cose. – fchen

0

Utilizzo Eclipse (Mars.1 versione 4.5.1, ID build: 20150924-1200) con un compilatore ARM (arm-none-eabi, 4.4.1). Ho avuto esattamente lo stesso problema di te. Il mio ex strada era:

D:\test\CodeSourcery\Sourcery G++ Lite\lib\gcc\arm-none-eabi\4.4.1\include 

Poi ho scoperto un'altra includono directory (postfix: 'fisso') presso le directory del compilatore:

D:\test\CodeSourcery\Sourcery G++ Lite\lib\gcc\arm-none-eabi\4.4.1\include-fixed 

Questo risolto tutto il mio errori che riguardano il rilevamento errato del tipo (ad es. uint16_t).