Eclipse成功编译,但仍然会产生语义错误
注意:它显然是一个经常性的问题StackOverflow,但是 – 我所看到的 – 人们从来没有find一种方法或他们的解决scheme不适合我
问题:
我正在使用Eclipse Juno ADT。 一切工作正常,直到我试图更新NDK。 我用新版本(即ndk-r8e
)replace了我的ndk
文件夹(即ndk-r8e
),并且在我的Paths and Symbols
configuration中,我将包含从g ++ 4.6更改为4.7。
它似乎打破了我的索引: 我可以编译我的代码,但是Eclipse正在给出语义错误,就像[ 1 ]和[ 2 ]中一样。 这些错误主要来源于OpenCV4Android使用的符号,如distance
, pt
, queryIdx
和trainIdx
。
当我尝试备份到我的旧configuration时,索引仍然被破坏! 我找不到改变这种情况的方法。
我曾经尝试过
- 清理项目
- 重build,刷新和“索引”子菜单中的所有其他选项(在项目上“右键单击”时)
- 在首选项中禁用/启用索引器
- validation像
trainIdx
这样的符号只出现在我的OpenCV4Android包含在Paths and Symbols
部分。 - 在“
Paths and Symbols
部分更改我的包含的顺序。 我基本上试图把OpenCV包括在开始和结束。
一些观察
什么不工作
我认为这是CDT指数,因为以下几点:
- 在命令行中,我可以使用
ndk-build clean
和ndk-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
错误, 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 ++常规 – >代码分析 – >启动。 确保两个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
选项卡 – >从Languages
selectGNU 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议:
- 尝试导入并构build
hello-jni
(它位于jni
的samples
文件夹中)。 如果运行没有问题,则将OpenCV链接到您的项目。 - 看来,你忘了更新
project properties -> c/c++ build -> environment
android-ndk
位置。 以下是构buildAndroid NDK项目的问题链接。 - 从控制台构build你的项目(
ndk-build -B
),手动删除Eclipse中的所有错误(在Problems
视图中select所有错误,只需单击删除 ),然后尝试立即运行项目。 有时这个“黑客”帮助我运行项目。 - 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文件不能解决问题)