Error de "inclusión no resuelta" con Eclipse CDT para encabezados de biblioteca estándar de C

96

Configuré CDT para eclipse y escribí un programa simple de hola mundo en C:

#include <stdio.h>

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

El programa se compila y se ejecuta correctamente, pero eclipse sigue mostrando este signo de interrogación amarillo al lado de la declaración de inclusión que dice "Unresolved inclusion: <stdio.h>"cuando coloco el mouse sobre él.

No afecta la ejecución del programa, pero lo encuentro bastante molesto.

¿Alguien tiene alguna idea de cómo eliminarlo?

Derrick Zhang
fuente
2
Pensaría que el ejemplo de Hello World haría esto por usted, o al menos proporcionaría algo de ayuda. Si eclipse no incluye un compilador, ¿por qué no?
Doug Molineux

Respuestas:

50

El compilador que Eclipse está usando es capaz de resolver bien los símbolos, por lo que el código se compilará bien.

Pero el código de finalización / indexador o preprocesador que utiliza Eclipse no sabe dónde stdio.hexiste.

Debe especificar la ruta del sistema de archivos donde stdio.hse encuentra.

La documentación de Eclipse describe esto en varias secciones para el compilador:

Y si el código de finalización / indexador o preprocesador específicamente tampoco puede localizar stdio.h:

La ubicación exacta de stdio.hdependerá del sistema para el que desee escribir el código. Si está escribiendo código para el mismo sistema en el que está ejecutando Eclipse, entonces la ubicación estándar es /usr/include/stdio.hpara Linux, macOS, Cygwin, etc.

Si está realizando una compilación cruzada para un sistema de destino separado / remoto (por ejemplo, Android, Raspberry Pi, STM32), estará ubicado en algún lugar del SDK que instaló para ese sistema. Deberá consultar esa documentación SDK en particular.

ardnew
fuente
2
Gracias por la respuesta. Pero, ¿dónde está el camino para Ubuntu 11.10?
Derrick Zhang
Una cosa que me confundió fue que tuve que agregar la ruta a la pestaña "incluye", en lugar de la pestaña "rutas de biblioteca". Siempre pensé que las inclusiones de "anglebracket" eran las de "biblioteca".
aaaidan
1
Usted especifica dónde encontrar los archivos de encabezado (es decir, archivos .h) en la pestaña incluye. Le indica al vinculador dónde puede encontrar archivos de biblioteca compilados en la pestaña de ruta de biblioteca. La convención de las comillas frente a los corchetes angulares depende probablemente del compilador, pero siempre pienso en <> que significa mirar primero en el lugar de la biblioteca del sistema estándar y "" significa buscar primero en mi proyecto.
Tod
2
Los compiladores modernos no distinguen entre comillas y corchetes angulares. Los cabezales de sistema convencionalmente estándar todavía se colocan entre paréntesis angulares.
Seppo Enarvi
53

Encontré estas respuestas (incluida la aceptada) algo crípticas.

Para mí, tuve que agregar la ruta donde se encuentra stdio.h (como dijo @ardnew). En Eclipse, abra las Propiedades de su proyecto, expanda "C / C ++ General" y seleccione "Rutas y símbolos".

Asegúrese de haber agregado el includedirectorio para cada idioma que esté usando. (En mi caso, solo necesitaba agregarlo a GNU C ++).

ingrese la descripción de la imagen aquí

aaaidan
fuente
¡Esto está inquietantemente cerca de lo que necesitaba! Solo tuve que cambiar el nombre de usuario en la ruta.
Lucas
2
En OS X, es posible que deba instalar manualmente las herramientas de desarrollo de la línea de comandos (que primero requiere la instalación de Xcode) usando el comando /usr/bin/xcode-select --instally luego podrá apuntar a Eclipse en/usr/include/
RobV
1
En Yosemite. Utilizando Eclipse Juno. Esto funcionó para mí, excepto que la ruta que había dado era un poco diferente (/ Users / SrinivasanNatarajan / android-ndk / platform / android-19 / arch-arm / usr / include). A pesar de que desaparecieron todos los errores no resueltos, todavía tengo la duda de que '¿puse el camino correcto?'. "Eclipse realmente apesta". Tuve que pasar horas para configurar el IDE para el desarrollo.
Srinivasan N
1
Gracias. Solo tu variante me ayudó.
Nikmoon
En mi caso (con MinGW), usé "Sistema de archivos ..." para agregar el directorio "C: \ MinGW \ include"
Gary99
17

simplemente agregando a la base de conocimientos, acabo de hacer esto en win7 con cygwin.

esto es lo que parece funcionar para mí.

incluir rutas para c:

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

incluir rutas para 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

esto me da una compilación limpia de hola mundo.

Ray Tayek
fuente
Yo soy del futuro. He venido a dar las gracias. En realidad, esto es lo primero que funcionó para mí. Nunca he tenido un hola mundo tan difícil. Gracias Señor.
nVentimiglia
17

Vaya a Proyecto> Propiedades> General de C / C ++> Incluye preprocesador> Proveedores y seleccione ambos:

  • "Configuración del compilador integrado CDT GCC"
  • "Configuración del compilador integrado CDT CROSS GCC"

Para cada uno de ellos, seleccione también la subentrada: "Utilizar proveedor global compartido entre proyectos".

Probado en Eclipse 4.8.0 en Ubuntu 16.04 con C y C ++ hello world.

Mike B
fuente
3
... y marque la casilla "Usar proveedor global compartido entre proyectos"
Urhixidur
También tuve que marcar "Usar proveedor global compartido entre proyectos" como mencionó @Urhixidur. Probé una gran cantidad de soluciones para este error de eclipse integrado y esta es la que realmente funcionó para mí. Esas líneas eran molestas. ¡Gracias!
CodeGuyRoss
10
  • Seleccione Archivo >> Nuevo proyecto
  • En el Asistente de proyectos, seleccione C / C ++ >> Proyecto C ++
  • En la sección "Tipo de proyecto", seleccione " Proyecto Makefile >> Proyecto Hello world C ++ "
  • En la sección "Cadenas de herramientas", seleccione " Linux GCC "

Puede solucionar el problema. (Disculpe el mal inglés)

Nader Aryabarzan
fuente
1
Hice esas cosas, pero todavía no reconocía que los encabezados están en / usr / include.
Hombre del espacio
Mucho más fácil que agregar todos y cada uno de ellos. Usé la opción de plataforma cruzada, que también funcionó bien (en Ubuntu)
panmari
¡Muy útil! Buen ingles.
AturSams
¿Cómo se hace esto en un proyecto existente?
Jay Elston
4

Estoy usando Eclipse con Cygwin y esto funcionó para mí:

Vaya a Proyecto> Propiedades> C / C ++ General> Incluye preprocesador ...> Proveedores y seleccione "Configuración del compilador integrado CDT GCC Cygwin [Compartido]".

superm0
fuente
4

Estoy trabajando con múltiples configuraciones de compiladores cruzados , donde necesito usar diferentes ubicaciones para los archivos de encabezado STD (y otras variables de entorno).

La solución fue configurar el indexador para que use la configuración activa.
Desafortunadamente, debido a algún error en eclipse , la opción no se almacena localmente, por lo que debe usar la configuración del espacio de trabajo si desea guardar la configuración cuando vuelva a abrir eclipse.

Ventana -> Preferencias -> C / C ++ -> Indexador -> Usar configuración de compilación activa

Esto hará que eclipse use el compilador correcto que está configurado con la configuración activa de Cross GCC del proyecto.

Yochai Timmer
fuente
Tuve el mismo problema, compilación cruzada en ESP8266. Lástima que esta página esté tan llena, tuve que resolverlo yo mismo.
Michael Böckling
Gracias por esto. También tuve este problema después de haber creado múltiples configuraciones de compiladores cruzados (para diferentes versiones del SDK integrado ESP32 "ESP-IDF"). El indexador no estaba recogiendo los encabezados correctos. Esta configuración parece permitir que el indexador use el mismo entorno que la configuración activa, lo que en mi caso le permitió seleccionar los encabezados correctos.
davidA
3

Como nota de las respuestas principales, es necesario especificar dónde se encuentran las carpetas de compilación, que se pueden agregar a través de un cuadro de diálogo al que se accede haciendo clic con el botón derecho en el proyecto y seleccionando Propiedades-> C / C ++ General-> Rutas y símbolos.

La pregunta restante es qué caminos deben agregarse.

Si ha configurado gcc correctamente para el acceso a la línea de comandos y necesita saber cuáles son las rutas de inclusión predeterminadas que utiliza, pregúntelo; según el idioma que le interese, utilice:

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

... esto mostrará la configuración predeterminada del compilador que se usa al invocar gcc (y este comando también funciona si "gcc" es realmente un alias para clang, como en OSX).

/dev/null se usa como un archivo vacío; le estamos diciendo a gcc que analice un archivo vacío

-x <language> especifica el idioma para compilar, necesario porque no estamos usando un archivo con una extensión que especifica el idioma

-v salida detallada, que incluye la salida de las rutas de inclusión

-E solo realiza el preprocesamiento, genera el archivo preprocesado (esto evita que gcc se queje de que un archivo vacío no se compila correctamente)

Hacia la parte inferior estará la lista de directorios incluidos:

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

Si ingresa los directorios enumerados aquí, en el orden enumerado, en el cuadro de diálogo de rutas y símbolos de Eclipse, Eclipse CDT debería poder encontrar los encabezados estándar y quizás algunos encabezados adicionales específicos de su sistema operativo.

(Gracias a la respuesta de devnull a una pregunta relacionada).

Theodore Murdock
fuente
MUY útil de hecho.
sancho.s ReinstateMonicaCellio
1

En ADT hice lo siguiente:

  1. haga clic derecho en el proyecto y seleccione Propiedades
  2. expanda C / C ++ General y seleccione Preprocesador Incluir rutas, macros, etc.
  3. seleccionar entradas de configuración de usuario de CDT
  4. seleccione Agregar ... en el menú de la derecha
  5. En Agregar directorio de inclusión, cambie la ruta del proyecto a la ruta del sistema de archivos
  6. Busque el directorio que contiene sus archivos de inclusión
  7. revuelva y repita según sea necesario
user330844
fuente
1

Normalmente, Eclipse debería poder resolver automáticamente los archivos de inclusión estándar. Lo hace llamando a gcc y preguntando su configuración. Lo más probable es que Eclipse no encuentre su gcc (o al menos no la versión que usa para compilar).

En lugar de especificar todas las rutas de inclusión estándar en la configuración del proyecto, probablemente desee asegurarse de que Eclipse encuentre gcc. Agregue el directorio donde se encuentra gcc a la variable de entorno PATH antes de iniciar Eclipse.

Si desea que diferentes proyectos utilicen diferentes compiladores, es posible que desee modificar las opciones de descubrimiento. Estos están ocultos de forma predeterminada, así que primero habilítelos desde Ventana> Preferencias> C / C ++> Configuración de páginas de propiedades> Mostrar la página "Opciones de descubrimiento". Luego, puede encontrarlos en C / C ++ Build> Discovery Options en las propiedades del proyecto.

Seppo Enarvi
fuente
1

Estoy usando CodeWarrior IDE basado en eclipse para proyectos incrustados y acabo de resolver este problema eliminando y agregando nuevamente las direcciones de origen a Project Properities-> C / C ++ General-> Path and Sybols-> Include Directories. Esto significa que hay muchas razones para aceptar el mensaje "Inclusión no resuelta:" y también hay muchas soluciones.

Enes Akyay
fuente
0

Un error que tuve al configurar Paths and Symbols es que inicialmente configuré las rutas de inclusión para un idioma diferente. Estoy trabajando con CDT y Cygwin gnu C ++. Por lo tanto, debe configurar símbolos y rutas en el lenguaje GNU C ++.ingrese la descripción de la imagen aquí

Rodolk
fuente
0

Además, ajuste ${COMMAND}a gccen Linux

Debajo:

  • Proyecto
  • Propiedades
  • C / C ++ General
  • El preprocesador incluye rutas, macros, etc.
  • Proveedores
  • Configuración del compilador integrado CDT GCC
  • Comando para obtener especificaciones del compilador

Reemplazar:

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

con:

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

Si no hace esto, la salida estándar de Eclipse muestra:

Unable to find full path for "-E"

y registros debajo de ${HOME}/eclipse-workspace/.metadata/.logmostrar:

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

porque ${COMMAND} ${FLAGS}están vacíos, por lo que Eclipse intenta ejecutar lo -Eque viene a continuación.

Me pregunto si podemos definir correctamente las variables COMMANDy FLAGSen la configuración, pero intenté agregarlas como variables de compilación y no funcionó.

Versión C ++ de la pregunta: ¿Cómo resolver "Inclusión no resuelta: <iostream>" en un archivo C ++ en Eclipse CDT?

Probado en Eclipse 2020-03 (4.15.0), Ubuntu 19.10 y este proyecto mínimo de Makefile con fuentes existentes .

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

¿Comprueba si se compila desde la línea de comandos? Para mí, ayuda en Linux, apt install libc-dev.

Jan B Noir
fuente