Eclipse успешно компилируется, но все равно дает семантические ошибки

ПРИМЕЧАНИЕ: это, по-видимому, повторяющийся вопрос о Stackru, но - насколько я видел, - либо люди никогда не находят пути, либо их решение не работает для меня

Эта проблема:

Я использую Eclipse Juno ADT. Все работало нормально, пока я не попытался обновить NDK. Я заменил свой ndk папка (это был ndk-r8d) новой версией (т.е. ndk-r8e) и, по моему Paths and Symbols Конфигурацию я изменил, чтобы включить переходы с g++ 4.6 на 4.7.

Казалось, это нарушило мой индекс: я мог скомпилировать свой код, но Eclipse давал семантические ошибки, точно так же, как в [ 1] и [ 2]. Ошибки в основном происходят из символов, используемых OpenCV4Android, таких как distance, pt, queryIdx а также trainIdx,

Когда я попытался сделать резервную копию в моей старой конфигурации, индекс все еще был поврежден! Я не могу найти способ изменить это.


Что я пробовал

  • Очистить проект
  • Перестроить, обновить и все другие параметры в подменю "Индекс" (при "щелчке правой кнопкой мыши" по проекту)
  • Отключить / включить индексатор в настройках
  • Убедитесь, что такие символы, как trainIdx появляются только в моем OpenCV4 Android включают в Paths and Symbols раздел.
  • Изменить порядок моих включений в Paths and Symbols раздел. Я в основном пытался поставить включение OpenCV в начале и в конце.

Некоторые наблюдения

Что не работает

Я предполагаю, что это индекс CDT из-за следующего:

  • В командной строке я могу построить свой проект, используя ndk-build clean а также ndk-build,
  • Когда я запускаю Eclipse, у меня нет ошибки, пока я не открою файл C++ (из jni папка).
  • Я всегда могу собрать проект, но пока я открыл файл C++, я больше не могу запускать приложение из-за большого количества Field '<name>' could not be resolved.
  • Если я не открою файлы C++, Eclipse не сообщит ни об одной ошибке и может успешно создать и развернуть приложение Android.

Интересный факт

Следующий код сообщает об ошибках на 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);

Если я напишу это следующим образом, это работает:

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

Дело не в том, что все функции OpenCV не решены: только pt, queryIdx а также trainIdx являются.

Любой комментарий будет по достоинству оценен.

8 ответов

Решение

В выбранных настройках проекта в среде Eclipse перейдите на C/C++ Общие -> Анализ кода -> Запуск. Убедитесь, что оба флажка сняты. Закройте и снова откройте проект или перезапустите затмение и пересоберите проект.

Поскольку индексирование для собственного кода Android в Eclipse является неполным, мне удалось включить индексацию в моих проектах NDK следующим неинтуитивным способом, и он должен работать независимо от того, используете ли вы ndk-build или простой make или даже cmake, Я использую Kepler, но он должен работать и на старых версиях.

Получите ваш набор инструментов правильно

  • Щелкните правой кнопкой мыши по проекту -> Properties -> C/C++ Build -> Tool Chain Editor -> Снять отметку Display compatible toolchains only,
  • В том же окне установите Current toolchain в Linux GCC,
  • В том же окне установите Current builder в Android Builder если вы используете ndk-buildустановите его на Gnu Make Builder в противном случае (этот шаг может быть неправильным, извините заранее, если это так).
  • Щелкните правой кнопкой мыши по проекту -> Properties -> C/C++ Build -> Build Variables -> Убедитесь, что Build command читает правильную команду для вашего проекта; если это не так, снимите флажок Use default build command и исправить это (это может быть ndk-build или же make -j5 что ты хочешь). Если вы создаете собственный код в отдельном терминале, вы можете пропустить этот шаг.

Создайте отдельный набор инструментов, это, вероятно, самый чистый способ получить источники STL в одном месте.

  • Перейдите в корневой каталог NDK.
  • Запустите следующее (настройте параметры по своему вкусу). добавлять sudo если у вас нет прав на запись в --install-dir потому что сценарий молча проваливается.

        ./build/tools/make-standalone-toolchain.sh \
            --platform=android-14 \
            --install-dir=/opt/android-toolchain \
            --toolchain=arm-linux-androideabi-4.8
    
  • Это предполагает, что вы используете GNU-STL. Если вы используете другую библиотеку C/C++, вам потребуется настроить вышеуказанную команду и, возможно, также включить пути в следующей команде.

Добавьте необходимые пути включения в ваш проект

  • Щелкните правой кнопкой мыши по проекту -> Properties -> C/C++ General -> Paths and Symbols -> Перейти к Includes вкладка -> Выбрать GNU C++ от Languages -> Нажмите Add и добавьте следующие пути (при условии, что вы установили отдельный набор инструментов в /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/
  • Здесь вы можете добавить любой включаемый путь. На самом деле, мой OpenCV построен для Android и установлен в автономной цепочке инструментов, поэтому я включил в него следующее:

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

Теперь индексирование должно работать. Вы также должны быть в состоянии бежать ndk-build (или же make если это ваш метод сборки), а затем разверните свой проект на вашем устройстве в Eclipse.

Зачем?

Нативная разработка Android на Eclipse не завершена, так как индексация не работает "из коробки". Это связано с необходимостью поддержки нескольких архитектур (ARMv7, Intel и т. Д.), Нескольких вариантов STL, нескольких версий Android и т. Д. Вот почему у вас есть голые make основан ndk-build и вся структура NDK, и именно поэтому разработка NDK очень грязная, и существует небольшое количество крупных проектов Android.

Большой проект для Android - OpenCV, где им пришлось разработать сценарий CMake на 1500 нечетных строк, чтобы он правильно компилировался для Android. В какой-то момент они попытались экспортировать этот скрипт как систему сборки на базе CMake для Android, но он не смог поспеть за изменениями в системе NDK и был заброшен. Эта поддержка должна была быть внутри самого NDK.

Системой сборки NDK по умолчанию должна была быть только отдельная цепочка инструментов со всеми различными библиотеками архитектур / C++, имеющими свои собственные цепочки инструментов за счет дискового пространства, но с преимуществом чистоты, интуитивности и хорошей практики. Затем вы можете включить любую стандартную систему кросс-компиляции, которая также используется в другом месте, протестирована и хорошо известна, например, CMake. Вы можете, и, на мой взгляд, вы должны сделать это с NDK make-standalone-toolchain команда, как показано выше. Но, в конце концов, это только мое мнение. Если вы чувствуете себя достаточно комфортно с ndk-build тогда иди вперед.

На самом деле довольно сложно сказать, в чем проблема. Вот несколько советов:

  1. Попробуй импортировать и собрать hello-jni (это находится в jni"s samples папка). Если он работает без проблем, то проблема заключается в подключении OpenCV к вашему проекту.
  2. Кажется, вы забыли обновить android-ndk расположение в project properties -> c/c++ build -> environment, Вот ссылка на проблему Проблема со сборкой проекта Android NDK.
  3. Сборка с консоли вашего проекта (ndk-build -B), удалите все ошибки в Eclipse вручную (в Problems просмотреть выберите все ошибки и просто нажмите " Удалить" и попробуйте запустить проект сейчас. Иногда этот "хак" помогает мне запустить проект.
  4. Закройте Eclipse и удалите папку path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core (Сделайте резервную копию сначала).

Я просто потратил около 3 часов, пытаясь справиться с этой проблемой индексации Eclipse NDK!..

Что заставило его работать: убедитесь, что в вашем файле Application.mk указана только ОДНА архитектура процессора.

В противном случае файл.metadata/.plugins/com.android.ide.eclipse.ndk/*. PathInfo не будет сгенерирован сборкой NDK. Этот файл содержит встроенные значения из Project -> Properties -> C/C++ General -> Paths and Symbols -> Includes (просто создание файла.pathInfo не решает проблему)

У меня была похожая ситуация с Eclipse CDT, работающим с библиотекой OpenCV. Я получил несколько сообщений об ошибках, когда программа скомпилирована правильно. Я изменил настройку индексатора в окне "окно-> настройки-> Индексатор" "построить конфигурацию для индексатора" на "Использовать активную конфигурацию", что решило мою проблему.

У меня была такая же проблема, как и у многих людей.

Я следовал за шагами в посте Ayberk Özgür, которые имеют смысл. Хотя я также должен был убедиться, что включает все три языка: GNU C, GNU C++ и Assembly. Возможно, потому что я не использую отдельную цепочку инструментов.

Сначала у меня были включения только под языками GNU C и GNU C++. Который оставил меня еще с неразрешенной ошибкой. До тех пор, пока я не назначил свои включения на языке ассемблера, мои ошибки не исчезли.

Я не знаю, почему Eclipse выполняет поиск только через Ассемблер, включенный в мой проект. Я также не знаю, как эта часть решения будет работать для более крупных и сложных проектов.

Надеюсь это поможет.

Я была такая же проблема. У меня были все необходимые настройки пути включения, но после открытия файла.c/.cpp или.h он начинал бы помечать все как "неразрешенные".
Это сработало для меня...
Идти к:
ПРЕДПОЧТЕНИЯ -> C/C++ -> INDEXER
Проверьте исходный индекс и заголовочные файлы, открытые в редакторе.

Перейдите в "Настройки"> "C/C++"> "Сопоставление языков"> "ADD" ("Исходный файл C" и выберите "GNU C"). Сделайте то же самое для C++

Другие вопросы по тегам