38 votes

Eclipse compile correctement, mais donne toujours des erreurs sémantiques

NOTE: apparemment, il est une question récurrente sur StackOverflow, mais pour ce que j'ai vu - soit les gens de ne jamais trouver un moyen ou leur solution ne fonctionne pas pour moi

Le problème:

Je suis à l'aide d'Eclipse Juno ADT. Tout fonctionnait bien jusqu'à ce que j'ai essayé de mettre à jour le NDK. J'ai remplacé mon ndk le dossier (qui est l' ndk-r8d) par la nouvelle version (c'est à dire ndk-r8e) et, dans ma Paths and Symbols configuration, j'ai changé le comprend pour passer de g++ 4.6 à 4.7.

Il semblait rompre mon indice: j'ai pu compiler mon code, mais Eclipse a été de donner les erreurs de sémantique, exactement comme dans [1] et [2]. Les erreurs principalement venir de symbole utilisé par OpenCV4Android, comme distance, pt, queryIdx et trainIdx.

Quand j'ai essayé de sauvegarde de mon ancienne configuration, l'indice était toujours en panne! Je ne peux pas trouver un moyen de changer cela.


Ce que j'ai essayé

  • Nettoyer le projet
  • Reconstruire, d'actualiser et de toutes les autres options dans la "Index" sous-menu (lorsque "clic droit" sur le projet)
  • Activer / désactiver l'indexation dans les préférences
  • Vérifier que les symboles tels que l' trainIdx n'apparaissent que dans mon OpenCV4Android inclure dans l' Paths and Symbols section.
  • Changer l'ordre de mes inclut dans l' Paths and Symbols section. En gros, j'ai essayé de mettre la OpenCV inclure au début et à la fin.

Quelques observations

Ce n'est pas de travail

Je suppose que c'est le CDT de l'indice pour les raisons suivantes:

  • En ligne de commande, je peux construire mon projet à l'aide d' ndk-build clean et ndk-build.
  • Quand j'ai commencer à Eclipse, je n'ai pas d'erreur jusqu'à ce que j'ouvre un fichier C++ (à partir de l' jni le dossier).
  • Je peux toujours construire le projet, mais aussi longtemps que j'ai ouvert un fichier C++, je ne peux pas exécuter l'application plus à cause de beaucoup d' Field '<name>' could not be resolved.
  • Si je ne l'ouvrez pas les fichiers C++, Eclipse n'est pas signaler toute erreur et que vous pouvez créer et déployer l'application Android avec succès.

Fait intéressant

Le code suivant signale les erreurs sur 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 je l'écris comme suit, ça fonctionne:

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);

Ce n'est pas que tous les OpenCV fonctions ne sont pas résolues: seulement pt, queryIdx et trainIdx sont.

Tout commentaire sera vraiment appréciée.

33voto

Alex Cohn Points 13248

Dans votre sélection de préférences du projet dans l'environnement Eclipse, allez dans C/C++ Général -> l'Analyse de Code -> Lancement. Assurez-vous que les deux cases à cocher sont désactivées.

10voto

Ayberk Özgür Points 569

Depuis indexation pour Android code natif sur Eclipse est incomplète, j'ai réussi à activer l'indexation dans mon NDK projets suivants est pas intuitive façon, il devrait fonctionner si vous utilisez ndk-build ou de la plaine make ou même cmake. Je suis l'aide de Kepler, mais il devrait fonctionner sur des versions plus anciennes aussi.

Obtenez votre chaîne d'outils à droite

  • Clic droit sur le projet -> Properties -> C/C++ Build -> Tool Chain Editor -> Décocher la case Display compatible toolchains only.
  • Dans la même fenêtre, définissez Current toolchain de Linux GCC.
  • Dans la même fenêtre, définissez Current builder de Android Builder si vous utilisez ndk-build, il Gnu Make Builder sinon (cette étape peut être mauvais, désolé à l'avance si c'est).
  • Clic droit sur le projet -> Properties -> C/C++ Build -> Build Variables -> assurez - Build command lit la commande correcte pour votre projet; si elle ne l'est pas, décochez Use default build command , et la corriger (il peut être ndk-build ou make -j5 que vous voulez). Si vous générez le code natif dans un autre terminal, vous pouvez sauter cette étape.

Rendre autonome de la chaîne, c'est probablement la façon la plus propre à obtenir STL sources en un seul endroit

  • Aller à la NDK répertoire racine.
  • Exécuter les opérations suivantes (modifier les paramètres selon votre goût). Ajouter sudo si vous ne disposez pas des autorisations d'écriture à l' --install-dir parce que le script échoue silencieusement.

        ./build/tools/make-standalone-toolchain.sh \
            --platform=android-14 \
            --install-dir=/opt/android-toolchain \
            --toolchain=arm-linux-androideabi-4.8
    
  • C'est en supposant que vous utilisez GNU-STL. Si vous utilisez un autre C/C++ de la bibliothèque, vous aurez besoin d'ajuster la commande ci-dessus, et sans doute aussi les chemins à inclure dans la prochaine commande.

Ajoutez les chemins à inclure à votre projet

  • Clic droit sur le projet -> Properties -> C/C++ General -> Paths and Symbols -> Aller à l' Includes tab -> Sélectionnez GNU C++ de Languages -> Cliquez sur Add et ajouter les chemins d'accès suivants (en supposant que vous avez installé la version autonome de la chaîne d' /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/
  • Ici, vous pouvez ajouter chaque chemin que vous voulez. En fait, j'ai mon OpenCV construit pour Android et installé dans la version autonome de la chaîne d', j'ai donc le suivant inclure:

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

Maintenant, l'indexation devrait fonctionner. Vous devez également être en mesure d'exécuter ndk-build (ou make si c'est votre méthode build), puis de déployer votre projet à votre appareil à l'intérieur de l'Éclipse.

Pourquoi?

Android natif de développement sur Eclipse est incomplète car l'indexation ne pas travailler hors de la boîte. C'est en raison de l'appui de plusieurs architectures (ARMv7, Intel, etc.), plusieurs STL options, de multiples versions d'Android etc. C'est pourquoi vous avez la nue - make base ndk-build et l'ensemble du NDK structure, et c'est aussi pourquoi NDK développement est très sale et peu de gros volume native Android, il existe des projets.

Un grand projet Android est OpenCV où ils ont eu à développer un 1500 impair ligne CMake script pour la compiler pour Android correctement. À un certain point, ils ont essayé d'exporter le script d'un CMake génération basé sur le système Android, mais il ne pouvait pas suivre les changements dans le NDK système et a été abandonnée. Ce soutien devrait avoir été à l'intérieur de NDK lui-même.

La valeur par défaut NDK système de construction doit avoir été autonome de la chaîne seulement, avec toutes les différentes architectures/C++ bibliothèques ayant leur propre toolchains au coût de l'espace de stockage, mais avec l'avantage de la propreté, l'intuitivité et de bonnes pratiques. Ensuite, vous pouvez inclure n'importe quel standard de la cross-compilation système est aussi utilisé ailleurs, a été testé et est bien connu, l'e.g CMake. Vous pouvez, et à mon avis, vous devriez le faire avec le NDK l' make-standalone-toolchain commande comme indiqué ci-dessus. Mais en fin de compte, ce n'est que mon avis. Si vous vous sentez assez à l'aise avec ndk-build puis aller de l'avant.

6voto

ArtemStorozhuk Points 6359

C'est en fait assez difficile de dire quel est le problème. Voici quelques conseils:

  1. Essayez d'importer et de construire hello-jni (il est situé en jnis' samples le dossier). Si elle s'exécute sans problème que le problème est avec le lien OpenCV à votre projet.
  2. Il semble que vous avez oublié de mettre à jour android-ndk emplacement en project properties -> c/c++ build -> environment. Voici le lien de problème de Problème avec la version Android NDK projet.
  3. Construire à partir de la console de votre projet (ndk-build -B), supprimer toutes les erreurs dans Eclipse manuellement (en Problems vue, sélectionnez toutes les erreurs et juste cliquez sur supprimer) et essayez d'exécuter le projet. Parfois, ce "hack" m'aide à exécuter le projet.
  4. À proximité de l'Éclipse et de supprimer le dossier path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core (sauvegarde d'abord).

0voto

user3163532 Points 1

Allez dans Préférences > C/C++ > Langue Mapping > AJOUTER (Source C Fichier et sélectionnez GNU C) Faire de même pour le C++

0voto

Pescolly Points 26

J'ai eu le même problème. J'ai eu tous les bons chemins à inclure l'installation, mais après l'ouverture de l' .c/.cpp ou .h fichier et le début du marquage tout comme "non résolus."
Cela a fonctionné pour moi...
Aller à:
PRÉFÉRENCES -> C/C++ -> INDEXEUR
Vérifier l'Indice de Source Et les Fichiers d'en-Tête de l'Ouvrir dans l'Éditeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X