Eclipse compila con éxito pero sigue dando errores semánticos


NOTA: aparentemente es una pregunta recurrente en StackOverflow, pero - por lo que he visto-o la gente nunca encuentra una manera o su solución no funciona para mí

El problema:

Estoy usando Eclipse Juno ADT. Todo estaba funcionando bien hasta que traté de actualizar el NDK. Reemplazé mi carpeta ndk (que era la ndk-r8d) por la nueva versión (es decir, ndk-r8e) y, en mi configuración Paths and Symbols, cambié las inclusiones para pasar de g++ 4.6 a 4.7.

Parecía para romper mi índice: pude compilar mi código, pero Eclipse estaba dando errores semánticos, exactamente como en [1] y [2]. Los errores principalmente provienen del símbolo utilizado por OpenCV4Android, comodistance, pt, queryIdx y trainIdx.

Cuando intenté hacer una copia de seguridad a mi configuración anterior, ¡el índice todavía estaba roto! No puedo encontrar una manera de cambiar esto.


Lo que he intentado

  • Limpiar el proyecto
  • Reconstruir, actualizar y todas las demás opciones en el submenú "Index" (al hacer" clic derecho " en el proyecto)
  • Desactivar / activar el indexador en las preferencias
  • Verifique que símbolos como trainIdx solo aparezcan en mi OpenCV4Android include en la sección Paths and Symbols.
  • Cambia el orden de mis inclusiones en la sección Paths and Symbols. Básicamente traté de poner el OpenCV include al principio y al final.

Algunas observaciones

Lo que no funciona

Asumo que es el índice CDT debido a lo siguiente:

  • En la línea de comandos, puedo compilar mi proyecto usando ndk-build clean y ndk-build.
  • Cuando inicio Eclipse, no tengo ningún error hasta que abro un archivo C++ (desde la carpeta jni).
  • Siempre puedo compilar el proyecto, pero mientras haya abierto un archivo C++, ya no puedo ejecutar la aplicación debido a una gran cantidad de {[16]]}
  • Si no abro los archivos C++, Eclipse no reporta ningún error y puede compilar e implementar la aplicación Android con éxito.

Hecho interesante

El siguiente código informa de errores en line, queryIdx, pt:

cv::line(mRgb, keypointsA[matches[i].queryIdx].pt, keypointsB[matches[i].trainIdx].pt, cv::Scalar(255, 0, 0, 255), 1, 8, 0);

Si lo escribo como sigue, funciona:{[26]]}

cv::DMatch tmpMatch = matches[i];
cv::KeyPoint queryKp = keypointsA[tmpMatch.queryIdx];
cv::KeyPoint trainKp = keypointsB[tmpMatch.trainIdx];
cv::line(mRgb, queryKp.pt, trainKp.pt, cv::Scalar(255, 0, 0, 255), 1, 8, 0);

No es que todas las funciones de OpenCV estén sin resolver: solo pt, queryIdx y trainIdx son.

Cualquier comentario será realmente apreciado.

Author: Community, 2013-05-28

8 answers

En las preferencias del proyecto seleccionado dentro del entorno Eclipse, vaya a C/C++ General -> Análisis de código -> Lanzamiento. Asegúrese de que ambas casillas de verificación estén desactivadas. Cierre y vuelva a abrir el proyecto o reinicie eclipse y recompile el proyecto.

 33
Author: Alex Cohn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-19 10:42:25

Dado que la indexación para el código nativo de Android en Eclipse está incompleta, logré habilitar la indexación en mis proyectos NDK de la siguiente manera poco intuitiva, debería funcionar si usa ndk-build o simplemente make o incluso cmake. Estoy usando Kepler, pero también debería funcionar en versiones anteriores.

Obtenga su cadena de herramientas bien

  • haga clic Derecho en el proyecto -> Properties -> C/C++ Build -> Tool Chain Editor -> Desactive Display compatible toolchains only.
  • En la misma ventana, establezca Current toolchain a Linux GCC.
  • En la misma ventana, establecer Current builder a Android Builder si está usando ndk-build, póngalo en Gnu Make Builder de lo contrario (este paso puede ser incorrecto, lo siento de antemano si lo es).
  • Haga clic derecho en el proyecto -> Properties -> C/C++ Build -> Build Variables -> Asegúrese de que Build command lee el comando correcto para su proyecto; si no lo es, desmarque Use default build command y corríjalo (puede ser ndk-build o make -j5 lo que desea). Si compila el código nativo en una terminal separada, puede omitir este paso.

Hacer una cadena de herramientas independiente, es probablemente la forma más limpia de obtener Fuentes STL en un solo lugar

  • Vaya al directorio raíz NDK.
  • Ejecute lo siguiente (ajuste la configuración de acuerdo a su gusto). Agregue sudo si no tiene permisos de escritura en --install-dir porque el script falla silenciosamente.

        ./build/tools/make-standalone-toolchain.sh \
            --platform=android-14 \
            --install-dir=/opt/android-toolchain \
            --toolchain=arm-linux-androideabi-4.8
    
  • Esto es asumiendo que usted usa GNU-STL. Si usa otra biblioteca de C / C++, necesitará modificar el comando anterior, y probablemente también las rutas de inclusión en el siguiente comando.

Añadir el necesario incluir rutas a su proyecto

  • Haga clic derecho en el proyecto -> Properties -> C/C++ General -> Paths and Symbols -> Vaya a la pestaña Includes - > Seleccione GNU C++ desde Languages - > Haga clic en Add y agregue las siguientes rutas (suponiendo que haya instalado la cadena de herramientas independiente para /opt/android-toolchain):

    • /opt/android-toolchain/include/
    • /opt/android-toolchain/include/c++/4.8/
    • /opt/android-toolchain/include/c++/4.8/arm-linux-androideabi/
    • /opt/android-toolchain/lib/gcc/arm-linux-androideabi/4.8/include/
    • /opt/android-toolchain/include/c++/4.8/backward/
    • /opt/android-toolchain/lib/gcc/arm-linux-androideabi/4.8/include-fixed/
    • /opt/android-toolchain/sysroot/usr/include/
  • Aquí, puede agregar cada ruta de inclusión que desee. De hecho, tengo mi OpenCV construido para Android e instalado en la cadena de herramientas independiente, así que tengo lo siguiente incluir allí:

    • /opt/android-toolchain/sysroot/usr/share/opencv/sdk/native/jni/include/

Ahora, la indexación debería funcionar. También debería poder ejecutar ndk-build (o make si ese es su método de compilación) y luego implementar su proyecto en su dispositivo dentro de Eclipse.

¿Por qué?

El desarrollo nativo de Android en Eclipse está incompleto ya que la indexación no funciona fuera de la caja. Esto es debido a tener que soportar múltiples arquitecturas (ARMv7, Intel, etc.), múltiples opciones STL, múltiples versiones de Android, etc. Esta es la razón por la que tienes el make basado en ndk-build y toda la estructura NDK, y esta es también la razón por la que el desarrollo de NDK es muy impuro y existen pocos proyectos de Android nativos de gran volumen.

Un gran proyecto de Android es OpenCV donde tuvieron que desarrollar un script CMake de 1500 líneas impares para compilarlo correctamente para Android. En algún momento, trataron de exportar ese script como un Sistema de compilación basado en CMake para Android, pero no pudo mantenerse al día con los cambios en el sistema NDK y fue abandonado. Este apoyo debería haber estado dentro del propio NDK.

El sistema de compilación predeterminado de NDK debería haber sido solo una cadena de herramientas independiente, con todas las diferentes arquitecturas/bibliotecas de C++ teniendo sus propias cadenas de herramientas a costa del espacio de almacenamiento, pero con la ventaja de limpieza, intuición y buenas prácticas. Luego puede incorporar cualquier sistema estándar de compilación cruzada que sea también se utiliza en otros lugares, está probado y es bien conocido, por ejemplo CMake. Puedes, y en mi opinión deberías, hacerlo con el comando make-standalone-toolchain del NDK como se muestra arriba. Pero al final, esta es solo mi opinión. Si se siente lo suficientemente cómodo con ndk-build, continúe.

 10
Author: Ayberk Özgür,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-08 11:19:16

En realidad, Es bastante difícil decir cuál es el problema. Estos son algunos consejos:

  1. Intenta importar y compilar hello-jni (se encuentra en la carpeta jni's samples). Si se ejecuta sin problemas que el problema es con la vinculación de OpenCV a su proyecto.
  2. Parece que olvidó actualizar android-ndk ubicación en project properties -> c/c++ build -> environment. Aquí está el enlace al problema Problema con la compilación del proyecto Android NDK.
  3. Compile desde la consola su proyecto (ndk-build -B), elimine todos los errores en Eclipse manualmente (en Problemsver seleccione todos los errores y simplemente haga clic en eliminar) e intente ejecutar el proyecto ahora. A veces este "hackeo" me ayuda a ejecutar el proyecto.
  4. Cierre Eclipse y elimine la carpeta path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core (haga una copia de seguridad primero).
 6
Author: ArtemStorozhuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:23

Vaya a Preferencias > C / C++ > Asignación de idiomas > AGREGAR (Archivo Fuente C y seleccione GNU C) Haga lo mismo para C++

 0
Author: user3163532,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-05 21:32:27

Tuve el mismo problema. Tenía todos los caminos apropiados, pero después de abrir el .c/.cpp o .h archivo y comenzaría a marcar todo como " Sin resolver."
Esto funcionó para mí...
Ir a:
PREFERENCIAS - > C / C++ - > INDEXADOR
Compruebe Los Archivos de Fuente de Índice Y Encabezado Se Abren en el Editor.

 0
Author: Pescolly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-21 06:02:15

Tuve el mismo problema, como mucha gente.

Seguí los pasos en Ayberk Özgür post, que tienen sentido. Aunque también tuve que asegurarme de poner includes bajo los tres lenguajes: GNU C, GNU C++ y Assembly. Probablemente porque no estoy usando una cadena de herramientas independiente.

Al principio solo tenía mis inclusiones bajo los lenguajes GNU C y GNU C++. Lo que me dejó todavía con el error sin resolver incluye. No hasta que asigné mi incluye bajo el lenguaje Ensamblador como lo hizo mi los errores desaparecen.

No sé por qué eclipse solo está buscando a través del Ensamblador incluido en mi proyecto. Tampoco sé cómo funcionará esta parte de la solución para proyectos más grandes y complicados.

Espero que esto ayude.

 0
Author: xdaimon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-25 17:01:42

Tuve la situación similar con Eclipse CDT trabajando con la biblioteca OpenCV. Recibí varios mensajes de error mientras el programa compilaba correctamente. Cambié la configuración del indexador en "ventana- > preferencias - >Indexador" "configuración de compilación para indexador" a "Usar configuración activa", lo que resolvió mi problema.

 0
Author: Pejman Habashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-26 03:03:30

Acabo de pasar alrededor de 3h golpeando mi cabeza contra este problema de indexación NDK Eclipse!..

Qué lo hizo funcionar: asegúrese de que tiene solo UNA arquitectura de cpu especificada en su Application.mk archivo.

De lo contrario el.metadatos/.plugins / com.androide.IDE.eclipsar.ndk/*.El archivo pathInfo no será generado por la compilación NDK. Este archivo contiene valores incorporados de Project - > Properties - > C/C++ General - > Paths and Symbols - > Includes (just making .Archivo pathInfo no soluciona el problema)

 0
Author: AccessViolation,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-16 13:09:23