it-roy-ru.com

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, у меня не возникает ошибки, пока я не открою файл 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.

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

38
JonesV

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

33
Alex Cohn

Поскольку индексирование для собственного кода 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 и т.д. Вот почему у вас есть ndk-build на основе make и вся структура NDK, и именно поэтому разработка NDK очень нечистый и существует несколько крупных проектов для Android. 

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

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

10
Ayberk Özgür

Его властям до сих пор не все в порядке. Zde jsou některé rady:

  1. Pokuste se importovat a vytvořit hello-jni (начальное значение для jnisamplesvariable_name__). Pokud běží be be problemů, je problém propojit OpenCV s vaším projektem.
  2. Пожалуйста, запомните, что актуализированы Android-ndk umístění v project properties -> c/c++ build -> environment. Пожалуйста, ознакомьтесь с Проблема с проектом Android NDK .
  3. Sestavte z konzoly svůj projekt (ndk-build -B), начальные оценки всех уровней в Eclipse (в отображении Problemsdelete))). Чтобы "взломать" мой новый проект.
  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

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

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

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

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

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

0
xdaimon

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

0
Pescolly

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

0
Pejman Habashi

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

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

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

0
AccessViolation

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

0
user3163532