web-dev-qa-db-fra.com

Eclipse compile avec succès mais donne toujours des erreurs sémantiques

NOTE: c'est apparemment une question récurrente sur StackOverflow, mais - pour ce que j'ai vu - les gens ne trouvent jamais de solution ou la solution ne fonctionne pas pour moi}

Le problème:

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

Cela semblait casser mon index: je pouvais compiler mon code, mais Eclipse donnait des erreurs sémantiques, exactement comme dans [ 1 ] et [ 2 ]. Les erreurs principalement proviennent du symbole utilisé par OpenCV4Android, tel que distance, pt, queryIdx et trainIdx.

Quand j'ai essayé de sauvegarder sur mon ancienne configuration, l'index était toujours cassé! Je ne peux pas trouver un moyen de changer cela.


Ce que j'ai essayé

  • Nettoyer le projet
  • Reconstruire, actualiser et toutes les autres options du sous-menu "Index" (lorsque vous cliquez avec le bouton droit de la souris sur le projet)
  • Désactiver/activer l'indexeur dans les préférences
  • Vérifiez que des symboles tels que trainIdx apparaissent uniquement dans mon OpenCV4Android inclus dans la section Paths and Symbols.
  • Modifiez l'ordre de mes inclus dans la section Paths and Symbols. J'ai essentiellement essayé de mettre OpenCV include au début et à la fin.

Quelques observations

Ce qui ne fonctionne pas

Je suppose que c'est l'indice CDT à cause des éléments suivants:

  • En ligne de commande, je peux construire mon projet en utilisant ndk-build clean et ndk-build.
  • Lorsque je lance Eclipse, je n'ai aucune erreur jusqu'à ce que j'ouvre un fichier C++ (à partir du dossier jni).
  • Je peux toujours construire le projet, mais tant que j'ai ouvert un fichier C++, je ne peux plus exécuter l'application à cause de beaucoup de Field '<name>' could not be resolved.
  • Si je n'ouvre pas les fichiers C++, Eclipse ne signale aucune erreur et peut créer et déployer l'application Android avec succès.

Fait intéressant

Le code suivant signale des 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, cela 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);

Toutes les fonctions OpenCV ne sont pas non résolues: seuls pt, queryIdx et trainIdx sont.

Tout commentaire sera vraiment apprécié.

38
JonesV

Dans les préférences de projet sélectionnées dans l'environnement Eclipse, accédez à C/C++ Général -> Analyse de code -> Lancement. Assurez-vous que les deux cases à cocher ne sont pas cochées. Fermez et rouvrez le projet ou redémarrez Eclipse et reconstruisez le projet.

33
Alex Cohn

Étant donné que l'indexation du code natif Android sur Eclipse est incomplète, j'ai réussi à activer l'indexation dans mes projets NDK de la manière non intuitive suivante. Cela devrait fonctionner si vous utilisez ndk-build ou plain make ou même cmake. J'utilise Kepler mais cela devrait aussi fonctionner avec les anciennes versions. 

Obtenez votre chaîne d'outils correctement

  • Faites un clic droit sur le projet -> Properties -> C/C++ Build -> Tool Chain Editor -> Décochez Display compatible toolchains only.
  • Dans la même fenêtre, définissez Current toolchain sur Linux GCC.
  • Dans la même fenêtre, définissez Current builder sur Android Builder si vous utilisez ndk-build, définissez-le sur Gnu Make Builder sinon (cette étape peut être fausse, veuillez nous excuser par avance si tel est le cas).
  • Faites un clic droit sur projet -> Properties -> C/C++ Build -> Build Variables -> Assurez-vous que Build command lit la commande correcte pour votre projet; si ce n'est pas le cas, décochez Use default build command et corrigez-le (il peut s'agir du ndk-build ou du make -j5 que vous souhaitez). Si vous construisez le code natif dans un terminal séparé, vous pouvez ignorer cette étape.

Créez une chaîne d’outils autonome, c’est probablement le moyen le plus propre d’obtenir des sources STL au même endroit.

  • Accédez au répertoire racine du NDK.
  • Exécutez ce qui suit (Modifiez les paramètres selon vos préférences). Ajoutez Sudo si vous n'avez pas les autorisations d'écriture sur --install-dir car le script échoue en mode silencieux. 

        ./build/tools/make-standalone-toolchain.sh \
            --platform=Android-14 \
            --install-dir=/opt/Android-toolchain \
            --toolchain=arm-linux-androideabi-4.8
    
  • Cela suppose que vous utilisez GNU-STL. Si vous utilisez une autre bibliothèque C/C++, vous devrez modifier la commande ci-dessus et probablement également les chemins d'inclusion dans la commande suivante. 

Ajoutez les chemins d'inclusion nécessaires à votre projet

  • Cliquez avec le bouton droit sur le projet -> Properties -> C/C++ General -> Paths and Symbols -> Accédez à l'onglet Includes -> Sélectionnez GNU C++ dans Languages -> cliquez sur Add et ajoutez les chemins suivants (en supposant que vous ayez installé la chaîne d'outils autonome pour /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 tous les chemins d'inclusion de votre choix. En fait, mon OpenCV est conçu pour Android et installé dans la chaîne d’outils autonome.

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

Maintenant, l'indexation devrait fonctionner. Vous devriez également pouvoir exécuter ndk-build (ou make si c'est votre méthode de génération), puis déployer votre projet sur votre périphérique dans Eclipse. 

Pourquoi?

Le développement natif d'Android sur Eclipse est incomplet car l'indexation ne fonctionne pas immédiatement. Cela est dû au fait qu’il faut prendre en charge plusieurs architectures (ARMv7, Intel, etc.), plusieurs options STL, plusieurs versions d’Android, etc. C’est pourquoi vous avez le ndk-build nu make et la structure NDK complète, et c’est aussi pourquoi le développement de NDK est très sale et il existe peu de projets Android natifs à grand volume. 

OpenCV est un grand projet Android, où ils ont dû développer un script CMake de 1500 lignes impaires pour le compiler correctement pour Android. À un moment donné, ils ont essayé d'exporter ce script en tant que système de construction basé sur CMake pour Android, mais ne parvenant pas à suivre l'évolution du système NDK, il a été abandonné. Ce support aurait dû être à l'intérieur même de NDK. 

Le système de construction NDK par défaut aurait dû être une chaîne d'outils autonome, toutes les architectures/bibliothèques C++ différentes ayant leurs propres chaînes d'outils au détriment de l'espace de stockage, mais avec l'avantage de la propreté, de l'intuition et des bonnes pratiques. Vous pouvez ensuite incorporer tout système de compilation croisée standard qui est également utilisé ailleurs, qui est testé et bien connu, par exemple CMake. Vous pouvez, et vous devriez, à mon avis, le faire avec la commande make-standalone-toolchain du NDK, comme indiqué ci-dessus. Mais au final, ce n’est que mon avis. Si vous vous sentez assez à l'aise avec ndk-build, continuez. 

10
Ayberk Özgür

Je suis parti pour docela těžké říct, co je problém. Zde jsou některé rady:

  1. Pokuste se importe un code de code hello-jni (nachází se ve složce jniname__samplesname__variable_name__). Définissez les problèmes, vous devez proposer le logiciel OpenCV s vaším projektem.
  2. Cliquez ici pour afficher le code Android-ndk umístění v project properties -> c/c++ build -> environment. Problèmes liés Problèmes liés au système Android NDK .
  3. Voir les projets similaires (ndk-build -B), cliquez ici pour afficher le code promo de chyby Eclipse (v zobrazení Problemsvyberte všechny chyby v Eclipse)delete) un projet de loi de croissance. Někdy à "pirater" le projet de loi de pomáhá.
  4. Zavřete Eclipse a smažte složku path-to-your-workspace/.metadata/.plugins/org.Eclipse.cdt.core (nejprve ji zálohujte).
6
ArtemStorozhuk

J'ai eu le même problème, comme beaucoup de gens.

J'ai suivi les étapes dans le post Ayberk Özgür, ce qui est logique. Bien que je devais aussi m'assurer de mettre des inclus dans les trois langages: GNU C, GNU C++ et Assembly. Probablement parce que je n'utilise pas une chaîne d'outils autonome.

Au début, mes inclus uniquement sous les langages GNU C et GNU C++. Ce qui m'a laissé toujours avec l'erreur non résolue inclut. Ce n'est que lorsque j'ai assigné mon inclusion dans la langue d'assembleur que mes erreurs ont disparu.

Je ne sais pas pourquoi Eclipse cherche uniquement dans l'assembleur inclus dans mon projet. Je ne sais pas non plus comment cette partie de la solution fonctionnera pour des projets plus complexes et de plus grande taille.

J'espère que cela t'aides.

0
xdaimon

J'ai eu le même problème. J'avais tous les chemins d'inclusion appropriés, mais après avoir ouvert le fichier .c/.cpp ou .h, il commençait à tout marquer comme "non résolu".
Cela a fonctionné pour moi.
Aller à:
PRÉFÉRENCES -> C/C++ -> INDEXER
Vérifier Indexer les fichiers source et d’en-tête ouverts dans Editor .

0
Pescolly

J'ai eu la même situation avec Eclipse CDT travaillant avec la bibliothèque OpenCV. J'ai reçu plusieurs messages d'erreur pendant que le programme était compilé correctement. J'ai changé le paramètre d'indexeur dans la boîte "fenêtre-> préférences-> Indexeur" "construire la configuration pour l'indexeur" en "Utiliser la configuration active" qui a résolu mon problème.

0
Pejman Habashi

Je viens de passer environ 3h à me cogner la tête contre ce problème d’indexation Eclipse NDK! ..

Ce qui a fait que cela fonctionne: assurez-vous que vous avez une seule architecture cpu spécifiée dans votre fichier Application.mk.

Sinon, le fichier .metadata/.plugins/com.Android.ide.Eclipse.ndk/*. PathInfo ne sera pas généré par la génération NDK. Ce fichier contient les valeurs intégrées de Projet -> Propriétés -> Général C/C++ -> Chemins et symboles -> Inclut (le simple fait de créer un fichier .pathInfo ne résout pas le problème)

0
AccessViolation

Allez dans Préférences> C/C++> Mappage de langue> AJOUTER (fichier source C et sélectionnez GNU c). Faites de même pour C++.

0
user3163532