Подтвердить что ты не робот

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

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

Проблема:

Я использую 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 отображаются только в моем OpenCV4Android, включают в раздел Paths and Symbols.
  • Измените порядок моих включений в разделе Paths and Symbols. Я в основном пытался включить OpenCV в начале и в конце.

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

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

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

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

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

4b9b3361

Ответ 1

В выбранных вами предпочтениях проекта в среде Eclipse перейдите к C/С++ General → Code Analysis → Launching. Убедитесь, что оба флажка сняты. Закройте и заново запустите проект или перезапустите eclipse и перестройте проект.

Ответ 2

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

Получить правую ссылку на инструмент

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

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

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

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

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

  • Щелкните правой кнопкой мыши по проекту → PropertiesC/C++ GeneralPaths 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 и установленный в автономной toolchain, поэтому у меня есть следующие возможности:

    • /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, где им нужно было разработать 1500 нечетных строк CMake script, чтобы заставить его правильно скомпилировать Android. В какой-то момент они попытались экспортировать эту script в качестве системы сборки на основе CMake для Android, но она не могла идти в ногу с изменениями в системе NDK и была оставлена. Эта поддержка должна была находиться внутри самого NDK.

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Я последовал за ступенями в почте Айберк Озгюр, которые имеют смысл. Хотя я также должен был обеспечить включение всех трех языков: GNU C, GNU С++ и Assembly. Возможно, потому, что я не использую отдельную цепочку инструментов.

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

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

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

Ответ 7

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

Ответ 8

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

Что заставило его работать: убедитесь, что в файле Application.mk указан только одна архитектура cpu.

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