wake-up-neo.com

Eclipse kompiliert erfolgreich, gibt jedoch immer noch semantische Fehler an

HINWEIS: Es ist anscheinend eine wiederkehrende Frage zu StackOverflow, aber - was ich gesehen habe - entweder finden die 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 (d. H. ndk-r8e) ersetzt, und in meiner Paths and Symbols-Konfiguration habe 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 aus, genau wie in [ 1 ] und [ 2 ]. Die Fehler hauptsächlich stammen von Symbolen, die von OpenCV4Android verwendet werden, wie distance, pt, queryIdx und trainIdx.

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


Was ich versucht habe

  • Bereinigen Sie das Projekt
  • Neuerstellen, 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 Voreinstellungen
  • Stellen Sie sicher, 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. Grundsätzlich habe ich versucht, das OpenCV-Include am Anfang und am Ende zu platzieren.

Einige Beobachtungen

Was funktioniert nicht?

Ich gehe davon aus, dass es den CDT-Index aus folgenden Gründen gibt:

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

Interessante Tatsache

Der folgende Code meldet Fehler in 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 wie folgt 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-Funktionen nicht gelöst sind: Nur pt, queryIdx und trainIdx sind.

Jeder Kommentar wird wirklich geschätzt.

38
JonesV

Wechseln Sie in den ausgewählten Projekteinstellungen in der Eclipse-Umgebung zu C/C++ Allgemein -> Codeanalyse -> Starten. Stellen Sie sicher, dass beide Kontrollkästchen nicht markiert sind. Schließen Sie das Projekt und öffnen Sie es erneut, oder starten Sie Eclipse neu und erstellen Sie das Projekt neu.

33
Alex Cohn

Da die Indizierung für Android-native Codes auf Eclipse unvollständig ist, konnte ich die Indizierung in meinen NDK-Projekten auf folgende unbeabsichtigte Weise aktivieren. Es sollte funktionieren, ob Sie ndk-build oder einfach make oder sogar cmake verwenden. . Ich benutze Kepler, aber es sollte auch mit älteren Versionen funktionieren. 

Holen Sie sich Ihre Toolchain richtig

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

Erstellen Sie eine eigenständige Toolchain. Dies ist wahrscheinlich der sauberste Weg, STL-Quellen an einem Ort zu erhalten

  • Wechseln Sie in das NDK-Stammverzeichnis.
  • Führen Sie Folgendes aus (Passen Sie die Einstellungen nach Ihren Wünschen an). Fügen Sie Sudo hinzu, wenn Sie keine Schreibberechtigung für --install-dir haben, da das Skript im Hintergrund 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 möglicherweise auch die Include-Pfade im nächsten Befehl anpassen. 

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 -> Wählen Sie GNU C++ aus Languages aus. -> Klicken Sie auf Add und fügen Sie die folgenden Pfade hinzu (vorausgesetzt, Sie haben die Standalone-Toolchain in /opt/Android-toolchain installiert):

    • /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. In der Tat habe ich meine OpenCV für Android gebaut und in der Standalone-Toolchain installiert. Daher habe ich Folgendes:

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

Nun sollte die Indizierung funktionieren. Sie sollten auch in der Lage sein, ndk-build (oder make, wenn dies Ihre Buildmethode ist) auszuführen und Ihr Projekt anschließend auf Ihrem Gerät in Eclipse bereitzustellen. 

Warum?

Die native Android-Entwicklung von Eclipse ist unvollständig, da die Indizierung nicht sofort funktioniert. Dies ist darauf zurückzuführen, dass mehrere Architekturen (ARMv7, Intel usw.), mehrere STL-Optionen, mehrere Android-Versionen usw. unterstützt werden müssen. Aus diesem Grund haben Sie die reine make-basierte ndk-build -Datei und die gesamte NDK-Struktur. Dies ist auch der Grund, warum die Entwicklung von NDK sehr unrein ist und es nur wenige native Android-Projekte gibt. 

Ein großes Android-Projekt ist OpenCV, bei dem ein CMake-Skript mit 1500 Zeilen entwickelt werden musste, damit es für Android ordnungsgemäß kompiliert werden konnte. Irgendwann versuchten sie, dieses Skript als CMake-basiertes Build-System für Android zu exportieren, aber es konnte nicht mit den Änderungen im NDK-System mithalten und wurde aufgegeben. Diese Unterstützung sollte in NDK selbst gewesen sein. 

Das Standard-NDK-Build-System sollte nur eine eigenständige Toolchain sein. Alle unterschiedlichen Architekturen/C++ - Bibliotheken haben ihre eigenen Toolchains zu Lasten des Speicherplatzes, jedoch mit dem Vorteil der Sauberkeit, der Intuitivität und der guten Praxis. Dann können Sie ein beliebiges Standard-Kreuzkompilierungssystem integrieren, das auch an anderer Stelle verwendet wird, getestet und bekannt ist, z. B. CMake. Sie können und sollten dies meiner Meinung nach mit dem Befehl make-standalone-toolchain des NDK wie oben gezeigt tun. Aber am Ende ist dies nur meine Meinung. Wenn Sie sich mit ndk-build wohl fühlen, fahren Sie fort. 

10
Ayberk Özgür

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

  1. Pokuste se importovat a vytvořit hello-jni (Nachází se ve složce jnisamplesvariable_name__). Pokud běží bez problémů, je problém propojit OpenCV s vaším projectem.
  2. Zdá se, že jste zapomněli aktualizovat Android-ndk umístění v project properties -> c/c++ build -> environment. Zde je odkaz na problém Problém s sestavením projektu Android NDK .
  3. Sestavte z konzoly svůj projekt (ndk-build -B), ručně odstraňte všechny chyby v Eclipse (v zobrazení Problems vyberte všechny chyby a klikněte nadelete) a zkuste nyní spustit projekt. Někdy "hacken" mi pomáhá spustit projekt.
  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

Ich hatte das gleiche Problem wie viele Menschen.

Ich habe die Schritte in Ayberk Özgür Post verfolgt, was durchaus Sinn macht. Obwohl ich auch sicherstellen musste, dass alle drei Sprachen mit include versehen sind: GNU C, GNU C++ und Assembly. Wahrscheinlich, weil ich keine eigenständige Werkzeugkette verwende.

Zuerst hatte ich meine Includes nur unter GNU C und GNU C++ - Sprachen. Was mir noch beim ungelösten Fehler blieb. Erst nachdem ich meine Includes unter der Assembler-Sprache zugewiesen habe, sind meine Fehler verschwunden.

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

Hoffe das hilft.

0
xdaimon

Ich hatte das gleiche Problem. Ich hatte alle richtigen Include-Pfade eingerichtet, aber nach dem Öffnen der .c/.cpp- oder .h-Datei wurde alles als "Nicht aufgelöst." Markiert
Das hat für mich funktioniert ...
Gehe zu:
EINSTELLUNGEN -> C/C++ -> INDEXER
Check Index-Quell- und Header-Dateien Im Editor öffnen .

0
Pescolly

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 habe die Indexer-Einstellung in "window-> preferences-> Indexer" im Feld "Konfiguration für Indexer erstellen" in "Use Active Configuration" geändert, wodurch mein Problem behoben wurde.

0
Pejman Habashi

Ich habe nur etwa 3 Stunden mit dem Kopf gegen dieses Eclipse NDK-Indexierungsproblem verbracht! ..

Was hat 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 integrierte Werte aus Project -> Properties -> C/C++ General -> Paths und Symbols -> Includes (durch das Erstellen der .pathInfo-Datei wird das Problem nicht behoben).

0
AccessViolation

Gehen Sie zu Voreinstellungen> C/C++> Sprachzuordnung> HINZUFÜGEN (Quelldatei C und wählen Sie GNU C). Machen Sie dasselbe für C++

0
user3163532