Eclipse可以成功编译,但仍然会出现语义错误
Eclipse compiles successfully but still gives semantic errors
注意:这显然是一个在StackOverflow上反复出现的问题,但是-就我所看到的-要么人们永远找不到方法,要么他们的解决方案对我不起作用
<标题>问题:我正在使用Eclipse Juno ADT。一切都很好,直到我试图更新NDK。我用新版本(即ndk-r8e
)替换了我的ndk
文件夹(即ndk-r8d
),并且,在我的Paths and Symbols
配置中,我将包含从g++ 4.6更改为4.7。
它似乎破坏了我的索引:我可以编译我的代码,但是Eclipse给出了语义错误,就像在[1]和[2]中一样。错误主要来自OpenCV4Android使用的符号,如distance
、pt
、queryIdx
和trainIdx
。
当我尝试备份到旧配置时,索引仍然是坏的!我找不到改变这一点的方法。
What I have try
- 清理项目
- 重建,刷新,以及"索引"子菜单中的所有其他选项(当"右键单击"项目时)
- 在首选项中禁用/启用索引器
- 验证符号,如
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
无法解析。
任何评论都将是非常感激的。
标题>标题>在Eclipse环境中选择的项目首选项中,转到C/c++ General -> Code Analysis -> Launching。确保两个复选框都未选中。关闭并重新打开项目或重新启动eclipse并重新构建项目。
由于在Eclipse上对Android本地代码进行索引是不完整的,因此我设法在我的NDK项目中以以下不直观的方式启用索引,无论您使用ndk-build
还是普通make
甚至cmake
,它都应该工作。我用的是开普勒,但它应该也能在旧版本上工作。
让你的工具链正确
- 右键单击项目->
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
,你想要的)。如果您在单独的终端中构建本机代码,则可以跳过此步骤。创建一个独立的工具链,这可能是在一个地方获得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++库,则需要调整上面的命令,可能还需要调整下一个命令中的包含路径。
将必要的include路径添加到项目
-
右键单击项目->
Properties
->C/C++ General
->Paths and Symbols
->转到Includes
选项卡->从Languages
中选择GNU C++
->单击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/
-
-
在这里,你可以添加任何你想要的包含路径。事实上,我已经为Android构建了我的OpenCV,并安装在独立的工具链中,所以我有以下内容:
-
/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,他们不得不开发一个1500行CMake脚本来让它在Android上正确编译。在某种程度上,他们试图将该脚本导出为基于CMake的Android构建系统,但它无法跟上NDK系统的变化,因此被放弃了。这种支持应该在NDK本身中。
默认的NDK构建系统应该是独立的工具链,所有不同的架构/c++库都有自己的工具链,以存储空间为代价,但具有干净,直观和良好实践的优势。然后,您可以合并任何标准的交叉编译系统,这些系统也在其他地方使用,经过测试并且是众所周知的,例如CMake。您可以,而且在我看来,您应该使用NDK的make-standalone-toolchain
命令,如上所示。但最终,这只是我的观点。如果你对ndk-build
感到足够舒服,那么继续吧。
实际上很难说出是什么问题。以下是一些建议:
- 尝试导入和构建
hello-jni
(它位于jni
的samples
文件夹)。如果它运行没有问题,那么问题在于将OpenCV链接到您的项目。 - 似乎你忘了在
project properties -> c/c++ build -> environment
中更新android-ndk
的位置。这是关于构建Android NDK项目的问题链接 - 从控制台构建您的项目(
ndk-build -B
),手动删除Eclipse中的所有错误(在Problems
视图中选择所有错误并单击delete),然后尝试现在运行项目。有时候这个"hack"可以帮助我运行项目。 - 关闭Eclipse并删除文件夹
path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core
(先备份它)。
转到首选项> C/c++>语言映射> ADD(源C文件并选择GNU C)对c++做同样的操作
我有同样的问题。我有所有适当的包括路径设置,但在打开。c/.cpp或。h文件后,它会开始将一切标记为"未解决"。
这对我有用…
去:
首选项-> c/c++ -> indexer
检查索引源文件和头文件是否在编辑器中打开.
和很多人一样,我也有同样的问题。
我遵循了Ayberk Özgür帖子中的步骤,这很有意义。尽管我还必须确保在所有三种语言下都包含:GNU C、GNU c++和汇编。可能是因为我没有使用一个独立的工具链。
我最初只使用GNU C和GNU c++语言。这给我留下了未解决的问题,包括错误。直到我在汇编语言下分配了包含,我的错误才消失。
我不知道为什么eclipse只在我的项目中搜索汇编程序。我也不知道这部分解决方案如何适用于更大更复杂的项目。
希望这对你有帮助。
我在Eclipse CDT与OpenCV库一起工作时遇到过类似的情况。当程序正确编译时,我得到了几个错误信息。我将"窗口->首选项->索引器"构建索引器配置"框中的索引器设置更改为"使用主动配置",从而解决了我的问题。
我刚刚花了大约3个小时来研究这个Eclipse NDK索引问题。
是什么使它工作:确保你有只有一个cpu架构指定在你的应用程序。可文件。
否则.metadata/.plugins/com.android.ide.eclipse.ndk/*。pathInfo文件将不会由NDK构建生成。该文件包含项目->属性-> C/c++通用->路径和符号->包含的内置值(仅制作.pathInfo文件不能解决问题)
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- Eclipse/CDT_C++给出"语义错误_"类型XXX无法解决"。项目运行
- 奇怪的语义错误
- 为什么包含std::字符串流的类的移动语义会导致编译器错误
- Android NDK 中的语义错误在 Ubuntu 中的 Eclipse 下
- Eclipse 索引器显示误报语义错误
- 在以 Qt 为单位为具有最小距离的点提供标志时出现语义错误
- 数独求解器中的语义错误
- c++time.h,clock_gettime(),语义错误,如何在Eclipse中链接实时库
- xcode 构建错误:从指针到较小类型"int"的语义问题丢失了信息
- 将值赋给常量的语法或语义错误
- c++移动语义编译错误C2751
- Boost spirit报告语义错误
- Eclipse可以成功编译,但仍然会出现语义错误
- c++:这怎么会是语义错误?
- OPENCV 2.4.9 cv2eigen语义错误
- Eclipse CDT显示语义错误,但构建成功
- 解析 Linux 内核文件时"Idle Service Error semantic-idle-summary-idle-function - Arithmetic error" cedet 语义错误