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
тогда иди вперед.
На самом деле довольно сложно сказать, в чем проблема. Вот несколько советов:
- Попробуй импортировать и собрать
hello-jni
(это находится вjni
"ssamples
папка). Если он работает без проблем, то проблема заключается в подключении OpenCV к вашему проекту. - Кажется, вы забыли обновить
android-ndk
расположение вproject properties -> c/c++ build -> environment
, Вот ссылка на проблему Проблема со сборкой проекта Android NDK. - Сборка с консоли вашего проекта (
ndk-build -B
), удалите все ошибки в Eclipse вручную (вProblems
просмотреть выберите все ошибки и просто нажмите " Удалить" и попробуйте запустить проект сейчас. Иногда этот "хак" помогает мне запустить проект. - Закройте 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++