Eclipse成功编译,但仍然会产生语义错误

注意:它显然是一个经常性的问题StackOverflow,但是 – 我所看到的 – 人们从来没有find一种方法或他们的解决scheme不适合我

问题:

我正在使用Eclipse Juno ADT。 一切工作正常,直到我试图更新NDK。 我用新版本(即ndk-r8e )replace了我的ndk文件夹(即ndk-r8e ),并且在我的Paths and Symbolsconfiguration中,我将包含从g ++ 4.6更改为4.7。

它似乎打破了我的索引: 我可以编译我的代码,但是Eclipse正在给出语义错误,就像[ 1 ]和[ 2 ]中一样。 这些错误主要来源于OpenCV4Android使用的符号,如distanceptqueryIdxtrainIdx

当我尝试备份到我的旧configuration时,索引仍然被破坏! 我找不到改变这种情况的方法。


我曾经尝试过

  • 清理项目
  • 重build,刷新和“索引”子菜单中的所有其他选项(在项目上“右键单击”时)
  • 在首选项中禁用/启用索引器
  • validation像trainIdx这样的符号只出现在我的OpenCV4Android包含在Paths and Symbols部分。
  • 在“ Paths and Symbols部分更改我的包含的顺序。 我基本上试图把OpenCV包括在开始和结束。

一些观察

什么不工作

我认为这是CDT指数,因为以下几点:

  • 在命令行中,我可以使用ndk-build cleanndk-build构build我的项目。
  • 当我启动Eclipse时,我没有错误,直到我打开一个C ++文件(从jni文件夹)。
  • 我总是可以build立这个项目,但是只要我打开了一个C ++文件,就不Field '<name>' could not be resolved.运行这个应用程序了,因为很多Field '<name>' could not be resolved.
  • 如果我不打开C ++文件,Eclipse不会报告任何错误,并且可以成功构build和部署Android应用程序。

有趣的事实

以下代码报告line queryIdx错误, queryIdxpt

 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函数都没有解决:只有ptqueryIdxtrainIdx是。

任何评论将非常感激。

在Eclipse环境中的所选项目首选项中,转至C / C ++常规 – >代码分析 – >启动。 确保两个checkbox均未选中。 closures并重新打开项目或重新启动eclipse并重build项目。

由于在Eclipse上的Android本地代码索引是不完整的,我设法在我的NDK项目中启用索引以下不直观的方式,它应该工作,无论你使用ndk-build或纯make ,甚至cmake 。 我正在使用开普勒,但它也应该在旧版本。

让你的工具链正确

  • 右键点击project – > Properties – > C/C++ Build – > Tool Chain Editor – >取消选中Display compatible toolchains only
  • 在同一个窗口中,将Current toolchain设置为Linux GCC
  • 在同一个窗口中,如果你正在使用ndk-build ,将Current builder设置为Android Builder ,否则将其设置为Gnu Make Builder (这一步可能是错误的,如果是的话提前抱歉)。
  • 右键点击project – > Properties – > C/C++ Build – > Build Variables – >确保Build command命令为你的项目读取正确的命令; 如果不是,请取消选中Use default build command并更正它(可能是ndk-build或者make -j5 )。 如果您在单独的terminal中构build本机代码,则可以跳过此步骤。

创build一个独立的工具链,这可能是在一个地方获得STL源代码的最简单的方法

  • 转到NDK根目录。
  • 运行以下(根据你的喜好调整设置)。 如果您没有对--install-dir写入权限,请添加sudo ,因为脚本无提示失败。

      ./build/tools/make-standalone-toolchain.sh \ --platform=android-14 \ --install-dir=/opt/android-toolchain \ --toolchain=arm-linux-androideabi-4.8 
  • 这是假设你使用GNU-STL。 如果您使用其他C / C ++库,则需要调整上述命令,并且可能还需要在下一个命令中包含includepath。

将必要的包含path添加到您的项目

  • 右键单击项目 – > Properties – > C/C++ General – > Paths and Symbols – >转到Includes选项卡 – >从LanguagesselectGNU C++ – >单击Add并添加以下path(假设您安装独立工具链/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/
  • 在这里,你可以添加你想要的每个包含path。 事实上,我有我的OpenCV为Android构build,并安装在独立的工具链,所以我有以下包括:

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

现在,索引应该工作。 你也应该可以运行ndk-build (或者如果这是你的构build方法),然后将你的项目部署到Eclipse中的设备上。

为什么?

Eclipse上的Android本地开发是不完整的,因为索引不起作用。 这是由于必须支持多种体系结构(ARMv7,Intel等),多个STL选项,多个Android版本等等。这就是为什么你需要裸机make ndk-build和整个NDK结构,这也是为什么NDK开发是非常不干净的,很less有大量的原生Android项目存在。

一个大的Android项目是OpenCV,他们必须开发一个1500奇数行的CMake脚本才能正确编译Android。 在某些时候,他们试图将这个脚本导出为一个基于CMake的Android构build系统,但是它跟不上NDK系统的变化并被抛弃了。 这个支持本来应该在NDK里面。

默认的NDK构build系统应该是独立的工具链,所有不同的架构/ C ++库都以自己的工具链为代价,但是却具有清洁,直观和良好的实践优势。 然后,您可以纳入任何其他地方也使用的标准交叉编译系统,经过testing并且是众所周知的,例如CMake。 你可以,在我看来你应该像NDK的make-standalone-toolchain命令那样做,如上所示。 但最后,这只是我的意见。 如果你对ndk-build感到满意,那就继续吧。

实际上很难说出什么问题。 以下是一些build议:

  1. 尝试导入并构buildhello-jni (它位于jnisamples文件夹中)。 如果运行没有问题,则将OpenCV链接到您的项目。
  2. 看来,你忘了更新project properties -> c/c++ build -> environment android-ndk位置。 以下是构buildAndroid NDK项目的问题链接。
  3. 从控制台构build你的项目( ndk-build -B ),手动删除Eclipse中的所有错误(在Problems视图中select所有错误,只需单击删除 ),然后尝试立即运行项目。 有时这个“黑客”帮助我运行项目。
  4. closuresEclipse并删除文件夹path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core (先备份)。

转到首选项> C / C ++>语言映射>添加(源C文件并selectGNU C)对C ++执行相同操作

我遇到过同样的问题。 我有所有适当的包括path设置,但打开.c / .cpp或.h文件后,它会开始标记为“未解决”的一切。
这对我工作…
去:
首选项 – > C / C ++ – > INDEXER
检查编辑器中打开的索引源和头文件

我有同样的问题,像很多人一样。

我遵循了AyberkÖzgür后台的步骤,这很有道理。 尽pipe我还必须确保把所有三种语言包括在内:GNU C,GNU C ++和汇编。 可能是因为我没有使用独立的工具链。

我起初只有GNU C和GNU C ++语言。 这仍然让我仍然没有解决包括错误。 直到我用Assembler语言指定我的包装,我的错误消失了。

我不知道为什么eclipse只通过汇编包含在我的项目中search。 我也不知道这部分解决scheme如何适用于更复杂的项目。

希望这可以帮助。

Eclipse CDT与OpenCV库的工作情况类似。 程序编译正确时,我得到了几个错误信息。 我在“窗口 – >首选项 – >索引器”“索引器的构buildconfiguration”框中的索引器设置更改为“使用主动configuration”,这解决了我的问题。

我刚刚花了大约3个小时对付这个Eclipse NDK索引问题!

工作原理:确保您的Application.mk文件中指定了一个CPU架构

否则,NDK构build不会生成.metadata / .plugins / com.android.ide.eclipse.ndk / *。pathInfo文件。 此文件包含项目 – >属性 – > C / C ++常规 – >path和符号 – >包含内置值(只是使.pathInfo文件不能解决问题)