Eclipse kompiliert erfolgreich, gibt aber immer noch semantische Fehler

HINWEIS: es ist anscheinend eine wiederkehrende Frage zu StackOverflow, aber – für das, was ich gesehen habe – entweder finden Leute nie einen Weg oder ihre Lösung funktioniert nicht für mich

Das Problem:

Ich benutze Eclipse Juno ADT. Alles funktionierte gut, bis ich versuchte, das NDK zu aktualisieren. Ich habe meinen ndk Ordner (das war der ndk-r8d ) durch die neue Version (dh ndk-r8e ) ersetzt und in meiner ndk-r8e und ndk-r8e ich die Includes geändert, um von g ++ 4.6 auf 4.7 zu wechseln.

Es schien meinen Index zu durchbrechen: Ich konnte meinen Code kompilieren, aber Eclipse gab semantische Fehler, genau wie in [ 1 ] und [ 2 ]. Die Fehler stammen hauptsächlich von dem von OpenCV4Android verwendeten Symbol wie distance , pt , queryIdx und trainIdx .

Als ich versuchte, meine alte Konfiguration zu sichern, war der Index immer noch kaputt! Ich kann keinen Weg finden, dies zu ändern.


Was ich versucht habe

  • Bereinigen Sie das Projekt
  • Neu aufbauen, aktualisieren und alle anderen Optionen im Untermenü “Index” (wenn Sie mit der rechten Maustaste auf das Projekt klicken)
  • Deaktivieren / aktivieren Sie den Indexer in den Einstellungen
  • trainIdx dass Symbole wie trainIdx nur in meinem OpenCV4Android-Include im Abschnitt Paths and Symbols angezeigt werden.
  • Ändern Sie die Reihenfolge meiner Includes im Abschnitt Paths and Symbols . Ich habe im Grunde versucht, den OpenCV am Anfang und am Ende einzubinden.

Einige Beobachtungen

Was nicht funktioniert

Ich nehme an, dass es der CDT-Index ist, weil:

  • In der Befehlszeile kann ich mein Projekt mit ndk-build clean und ndk-build .
  • Wenn ich Eclipse jni , habe ich keinen Fehler, bis ich eine C ++ – Datei jni (aus dem jni Ordner).
  • Ich kann das Projekt immer erstellen, aber solange ich eine C ++ – Datei geöffnet habe, kann ich die Anwendung nicht mehr ausführen, da eine Menge von Field '' could not be resolved.
  • Wenn ich die C ++ – Dateien nicht öffne, meldet Eclipse keinen Fehler und kann die Android-Anwendung erfolgreich erstellen und bereitstellen.

Interessante Tatsache

Der folgende Code meldet Fehler 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); 

Wenn ich es folgendermaßen schreibe, funktioniert es:

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

Es ist nicht so, dass alle OpenCV-functionen nicht trainIdx sind: nur pt , queryIdx und trainIdx sind.

Jeder Kommentar wird sehr geschätzt.

   

Wechseln Sie in den ausgewählten Projekteinstellungen in der Eclipse-Umgebung zu C / C ++ – Allgemein -> Code Analysis -> Launching. Stellen Sie sicher, dass beide Kontrollkästchen deaktiviert sind. Schließen und öffnen Sie das Projekt oder starten Sie Eclipse neu und erstellen Sie das Projekt neu.

Da die Indizierung für den nativen Android-Code auf Eclipse unvollständig ist, konnte ich die Indizierung in meinen NDK-Projekten auf die folgende nicht intuitive Weise ndk-build : Es sollte funktionieren, ob Sie ndk-build oder plain make oder sogar cmake . Ich benutze Kepler, aber es sollte auch bei älteren Versionen funktionieren.

Mach deine Toolchain richtig

  • Klicken Sie mit der rechten Maustaste auf Projekt -> Properties -> C/C++ Build -> Tool Chain Editor -> Deaktivieren Sie Nur Display compatible toolchains only .
  • Setzen Sie im selben Fenster Current toolchain auf Linux GCC .
  • Setzen Sie im selben Fenster den Current builder auf Android Builder wenn Sie ndk-build , und setzen Sie ihn ansonsten auf Gnu Make Builder (dieser Schritt ist möglicherweise falsch, wenn Sie es im Voraus ndk-build ).
  • Klicken Sie mit der rechten Maustaste auf Projekt -> Properties -> C/C++ Build -> Build Variables -> Stellen Sie sicher, Build command liest den richtigen Befehl für Ihr Projekt; Wenn dies nicht der Fall ist, deaktivieren Sie die Option Use default build command und korrigieren Sie sie (möglicherweise ist es ndk-build oder make -j5 , das Sie möchten). Wenn Sie den systemeigenen Code in einem separaten Terminal erstellen, können Sie diesen Schritt überspringen.

Machen Sie eine eigenständige Toolchain, das ist wahrscheinlich der sauberste Weg, um STL-Quellen an einem Ort zu finden

  • Wechseln Sie zum NDK-Stammverzeichnis.
  • Führen Sie Folgendes aus (optimieren Sie die Einstellungen nach Ihren Wünschen). Fügen Sie sudo wenn Sie keine Schreibberechtigungen für das --install-dir weil das Skript im --install-dir fehlschlägt.

      ./build/tools/make-standalone-toolchain.sh \ --platform=android-14 \ --install-dir=/opt/android-toolchain \ --toolchain=arm-linux-androideabi-4.8 
  • Dies setzt voraus, dass Sie GNU-STL verwenden. Wenn Sie eine andere C / C ++ – Bibliothek verwenden, müssen Sie den obigen Befehl und wahrscheinlich auch die Include-Pfade im nächsten Befehl optimieren.

Fügen Sie Ihrem Projekt die erforderlichen Include-Pfade hinzu

  • Klicken Sie mit der rechten Maustaste auf Projekt -> Properties -> C/C++ General -> Paths and Symbols -> Gehen Sie zur Registerkarte Includes -> GNU C++ aus Languages auswählen -> Klicken Sie auf Add und fügen Sie die folgenden Pfade hinzu (vorausgesetzt, Sie haben die eigenständige Toolchain installiert) /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/
  • Hier können Sie jeden gewünschten Include-Pfad hinzufügen. Tatsächlich habe ich meinen OpenCV für Android gebaut und in der Standalone-Toolchain installiert, daher habe ich folgendes dort:

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

Jetzt sollte die Indizierung funktionieren. Sie sollten auch in der Lage sein, ndk-build (oder make falls dies Ihre Build-Methode ist) und dann Ihr Projekt auf Ihrem Gerät in Eclipse ndk-build .

Warum?

Die native Entwicklung von Android in Eclipse ist unvollständig, da die Indizierung nicht ohne weiteres funktioniert. Dies liegt daran, dass Sie mehrere Architekturen (ARMv7, Intel usw.), mehrere STL-Optionen, mehrere Android-Versionen usw. unterstützen müssen. Deshalb haben Sie das blank make basierte ndk-build und die gesamte NDK-Struktur, und das ist auch der Grund warum NDK Entwicklung ist sehr unsauber und wenige großvolumige native Android-Projekte existieren.

Ein großes Android-Projekt ist OpenCV, wo sie ein 1500-Zeilen-CMake-Skript entwickeln mussten, um es für Android richtig kompilieren zu lassen. Irgendwann versuchten sie, das Skript als CMake-basiertes Build-System für Android zu exportieren, aber es konnte mit den Änderungen im NDK-System nicht Schritt halten und wurde aufgegeben. Diese Unterstützung sollte innerhalb von NDK selbst stattfinden.

Das Standard-NDK-Build-System sollte nur Standalone-Toolchain sein, wobei alle unterschiedlichen Architekturen / C ++ – Bibliotheken ihre eigenen Toolchains auf Kosten von Speicherplatz haben, aber mit dem Vorteil von Sauberkeit, Intuitivität und guter Praxis. Dann können Sie jedes Standard-Cross-Compilation-System einbinden, das auch an anderer Stelle eingesetzt wird, getestet und bekannt ist, zB CMake. Sie können dies, und meiner Meinung nach, mit dem Befehl make-standalone-toolchain des NDK tun, wie oben gezeigt. Aber am Ende ist das nur meine Meinung. Wenn du dich mit ndk-build wohl ndk-build dann ndk-build weiter.

Es ist eigentlich ziemlich schwer zu sagen, was das Problem ist. Hier sind einige Ratschläge:

  1. Versuchen Sie hello-jni zu importieren und zu hello-jni (es befindet sich im samples Ordner von jni ). Wenn es ohne Probleme läuft, ist das Problem, OpenCV mit Ihrem Projekt zu verbinden.
  2. Es scheint, dass Sie vergessen haben, android-ndk Speicherort in project properties -> c/c++ build -> environment zu aktualisieren project properties -> c/c++ build -> environment . Hier ist der Link zum Problem Problem mit Build Android NDK-Projekt .
  3. Erstellen Sie aus der Konsole Ihr Projekt ( ndk-build -B ), löschen Sie alle Fehler in Eclipse manuell (in der Ansicht Problems wählen Sie alle Fehler aus und klicken Sie einfach auf Löschen ) und versuchen Sie, das Projekt jetzt auszuführen. Manchmal hilft mir dieser “Hack” beim Ausführen eines Projekts.
  4. Schließen Sie Eclipse und löschen Sie den Ordner path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core (sichern Sie ihn zuerst).

Gehe zu Einstellungen> C / C ++> Sprachzuordnung> HINZUFÜGEN (Quelle C-Datei und wähle GNU C) Mach das gleiche für C ++

Ich hatte das gleiche Problem. Ich hatte alle richtigen Include-Pfade eingerichtet, aber nachdem ich die .c / .cpp oder .h-Datei geöffnet hatte, würde alles als “Unresolved” markiert werden.
Das hat für mich funktioniert …
Gehe zu:
VOREINSTELLUNGEN -> C / C ++ -> INDEXER
Überprüfen Sie die Index-Quell- und Header-Dateien im Editor .

Ich hatte das gleiche Problem, wie viele Leute.

Ich folgte den Schritten in Ayberk Özgür Post, die sinnvoll sind. Obwohl ich auch sicherstellen musste, dass die Includes in allen drei Sprachen enthalten sind: GNU C, GNU C ++ und Assembly. Wahrscheinlich, weil ich keine eigenständige Werkzeugkette verwende.

Ich hatte zuerst meine Includes nur unter GNU C und GNU C ++ – Sprachen. Was mich immer noch mit dem ungetriggersen Fehler behaftet hat. Erst nachdem ich meine Includes auch der Assembler-Sprache zugewiesen hatte, verschwanden meine Fehler.

Ich weiß nicht, warum Eclipse nur durch den Assembler in meinem Projekt sucht. Ich weiß auch nicht, wie dieser Teil der Lösung für größere kompliziertere Projekte funktionieren wird.

Hoffe das hilft.

Ich hatte eine ähnliche Situation mit Eclipse CDT, die mit der OpenCV-Bibliothek arbeitete. Ich habe mehrere Fehlermeldungen erhalten, während das Programm korrekt kompiliert wurde. Ich änderte die Indexer-Einstellung in “window-> preferences-> Indexer” “Build-Konfiguration für Indexer” auf “Aktive Konfiguration verwenden”, wodurch mein Problem getriggers wurde.

Ich habe gerade 3 Stunden damit verbracht, gegen dieses Eclipse NDK Indizierungsproblem anzukämpfen.

Was hat es funktioniert: Stellen Sie sicher, dass Sie nur eine CPU-Architektur in Ihrer Application.mk-Datei angegeben haben.

Andernfalls wird die Datei .metadata / .plugins / com.android.ide.eclipse.ndk / *. PathInfo nicht vom NDK-Build generiert. Diese Datei enthält eingebaute Werte von Projekt -> Eigenschaften -> C / C ++ – Allgemein -> Pfade und Symbole -> Includes (nur machen .pathInfo Datei behebt das Problem nicht)