Eclipse编译成功但仍然会出现语义错误

时间:2013-05-28 07:46:17

标签: android c++ eclipse opencv android-ndk

注意:它显然是关于StackOverflow的一个经常出现的问题,但是 - 对于我所看到的 - 人们从来没有找到方法或者他们的解决方案对我不起作用

问题:

我正在使用Eclipse Juno ADT。在我尝试更新NDK之前,一切正常。我用新版本(即ndk)替换了我的ndk-r8d文件夹(即ndk-r8e),并且在我的Paths and Symbols配置中,我将包含更改为来自g ++ 4.6到4.7。

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

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


我尝试了什么

  • 清理项目
  • 重建,刷新以及“索引”子菜单中的所有其他选项(在项目中“右键单击”时)
  • 在首选项中禁用/启用索引器
  • 确认trainIdx等符号仅出现在Paths and Symbols部分的OpenCV4Android中。
  • Paths and Symbols部分更改我的包含的顺序。我基本上试图将OpenCV包含在开头和结尾。

一些观察

什么不起作用

我认为它是 CDT索引,原因如下:

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

有趣的事实

以下代码报告linequeryIdxpt上的错误:

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

任何评论都会非常感激。

8 个答案:

答案 0 :(得分:33)

在Eclipse环境中的所选项目首选项中,转到C / C ++ General - &gt;代码分析 - &gt;发射。确保未选中这两个复选框。关闭并重新打开项目或重新启动eclipse并重建项目。

答案 1 :(得分:10)

由于Eclipse上的Android本机代码索引不完整,我设法在以下非直观的方式启用NDK项目中的索引,无论您使用ndk-build还是普通make甚至是{{{} 1}}。我正在使用Kepler,但它也适用于旧版本。

正确使用您的工具链

  • 右键点击项目 - &gt; cmake - &gt; Properties - &gt; C/C++ Build - &gt;取消选中Tool Chain Editor
  • 在同一窗口中,将Display compatible toolchains only设为Current toolchain
  • 在同一窗口中,如果您使用的是Linux GCC,请将Current builder设置为Android Builder,否则请将其设置为ndk-build(此步骤可能有误,请提前对不起如果是)。
  • 右键点击项目 - &gt; Gnu Make Builder - &gt; Properties - &gt; C/C++ Build - &gt;确保Build Variables为您的项目读取正确的命令;如果不是,请取消选中Build command并更正(可能是Use default build commandndk-build您想要的)。如果您在单独的终端中构建本机代码,则可以跳过此步骤。

制作一个独立的工具链,这可能是在一个地方获取STL资源的最简洁方法

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

    --install-dir
  • 这是假设您使用GNU-STL。如果您使用另一个C / C ++库,则需要调整上面的命令,也可能需要调整下一个命令中的包含路径。

为项目添加必要的包含路径

  • 右键点击项目 - &gt; ./build/tools/make-standalone-toolchain.sh \ --platform=android-14 \ --install-dir=/opt/android-toolchain \ --toolchain=arm-linux-androideabi-4.8 - &gt; Properties - &gt; C/C++ General - &gt;转到Paths and Symbols标签 - &gt;从Includes - &gt;中选择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/
  • 在这里,您可以添加所需的每个包含路径。事实上,我的OpenCV是为Android而构建的,并且安装在独立的工具链中,因此我有以下内容:

    • /opt/android-toolchain/sysroot/usr/include/

现在,索引应该可行。您还应该能够运行/opt/android-toolchain/sysroot/usr/share/opencv/sdk/native/jni/include/(或ndk-build,如果这是您的构建方法),然后将项目部署到Eclipse内的设备。

为什么?

Eclipse上的Android原生开发是不完整的,因为索引不是开箱即用的。这是因为必须支持多种体系结构(ARMv7,Intel等),多个STL选项,多个Android版本等。这就是为什么你有基于make的{​​{1}}和整个NDK结构的原因,这也是为什么NDK开发非常不干净并且存在少量大量本机Android项目的原因。

一个重要的Android项目是OpenCV,他们必须开发一个1500多行的CMake脚本才能让它正确地为Android编译。在某些时候,他们试图将该脚本导出为基于CMake的Android构建系统,但它无法跟上NDK系统的变化并被放弃。这种支持应该在NDK内部。

默认的NDK构建系统应该只是独立的工具链,所有不同的架构/ C ++库都以存储空间为代价拥有自己的工具链,但具有清洁,直观和良好实践的优势。然后,您可以合并任何标准的交叉编译系统,该系统也在其他地方使用,经过测试并且是众所周知的,例如CMake。您可以,并且我认为您应该使用NDK的make命令执行此操作,如上所示。但最后,这只是我的意见。如果您对ndk-build感到满意,那就继续吧。

答案 2 :(得分:6)

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

  1. 尝试导入并构建hello-jni(它位于jni的{​​{1}}文件夹中)。如果它运行没有问题,那么将OpenCV链接到您的项目就会出现问题。
  2. 您似乎忘记更新samples中的android-ndk位置了。这是问题Issue with build Android NDK project的链接。
  3. 从控制台构建项目(project properties -> c/c++ build -> environment),手动删除Eclipse中的所有错误(在ndk-build -B视图中选择所有错误,只需单击 delete )并尝试运行项目现在。有时这种“黑客”会帮助我运行项目。
  4. 关闭Eclipse并删除文件夹Problems(先备份)。

答案 3 :(得分:0)

转到首选项&gt; C / C ++&gt;语言映射&gt; ADD(源C文件并选择GNU C)对C ++执行相同的操作

答案 4 :(得分:0)

我有同样的问题。我已经设置了所有正确的包含路径,但在打开.c / .cpp或.h文件后,它会开始标记所有内容为&#34;未解析。&#34;
这对我有用......
转到:
偏好 - &gt; C / C ++ - &gt;分度
检查在编辑器中打开的索引源和头文件

答案 5 :(得分:0)

我和许多人一样有同样的问题。

我按照AyberkÖzgür帖子中的步骤进行操作,这很有道理。虽然我还必须确保在所有三种语言下添加包括:GNU C,GNU C ++和Assembly。可能是因为我没有使用独立的工具链。

我起初只使用GNU C和GNU C ++语言。这让我仍然处理未解决的包含错误。直到我用汇编语言分配我的包含,我的错误才消失。

我不知道为什么eclipse只搜索我的项目中的Assembler包含。我也不知道这部分解决方案如何适用于更复杂的项目。

希望这有帮助。

答案 6 :(得分:0)

Eclipse CDT使用OpenCV库的情况与此类似。程序编译正确时,我收到了几条错误消息。我更改了&#34; window-&gt; preferences-&gt; Indexer&#34;中的索引器设置。 &#34;为索引器构建配置&#34;框到&#34;使用活动配置&#34;这解决了我的问题。

答案 7 :(得分:0)

我花了大约3小时的时间来对抗这个Eclipse NDK索引问题!...

使其有效的原因:确保您的Application.mk文件中指定了仅一个cpu架构

否则NDK构建将不会生成.metadata / .plugins / com.android.ide.eclipse.ndk / * .pathInfo文件。此文件包含Project中的内置值 - &gt;属性 - &gt; C / C ++一般 - &gt;路径和符号 - &gt;包含(只是使.pathInfo文件无法解决问题)