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

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

Проблема:

Я использую Eclipse Juno ADT. Все работало нормально, пока я не попытался обновить NDK. Я заменил мою ndk папку (которая была ndk-r8d ) на новую версию (т. ndk-r8e ), и в моей конфигурации « Paths and Symbols я изменил ndk-r8e , начиная с 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, у меня нет ошибки, пока я не открою файл 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 .

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

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

Поскольку индексирование для собственного кода Android на Eclipse является неполным, мне удалось включить индексирование в моих проектах NDK следующим образом: он должен работать независимо от того, используете ли вы ndk-build или plain 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 и т. Д. Поэтому у вас есть основанная на ndk-build и всей структуре NDK, и именно поэтому NDK Разработка очень нечиста, и существует несколько крупных пользовательских Android-проектов большого объема.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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