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

Eclipse compiles successfully but still gives semantic errors

本文关键字:错误 语义 成功 编译 Eclipse      更新时间:2023-10-16

注意:这显然是一个在StackOverflow上反复出现的问题,但是-就我所看到的-要么人们永远找不到方法,要么他们的解决方案对我不起作用

<标题>问题:

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

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

当我尝试备份到旧配置时,索引仍然是坏的!我找不到改变这一点的方法。


What I have try

  • 清理项目
  • 重建,刷新,以及"索引"子菜单中的所有其他选项(当"右键单击"项目时)
  • 在首选项中禁用/启用索引器
  • 验证符号,如trainIdx只出现在我的OpenCV4Android包含在Paths and Symbols部分。
  • 更改Paths and Symbols部分中包含的顺序。我基本上试着把OpenCV包括在开始和结束。

<标题> 中观察到的一些情况

什么不工作

我假设它是CDT索引,因为如下:

  • 在命令行中,我可以使用ndk-build cleanndk-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函数都无法解析:只有ptqueryIdxtrainIdx无法解析。

任何评论都将是非常感激的。

在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-buildmake -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感到足够舒服,那么继续吧。

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

  1. 尝试导入和构建hello-jni(它位于jnisamples文件夹)。如果它运行没有问题,那么问题在于将OpenCV链接到您的项目。
  2. 似乎你忘了在project properties -> c/c++ build -> environment中更新android-ndk的位置。这是关于构建Android NDK项目的问题链接
  3. 从控制台构建您的项目(ndk-build -B),手动删除Eclipse中的所有错误(在Problems视图中选择所有错误并单击delete),然后尝试现在运行项目。有时候这个"hack"可以帮助我运行项目。
  4. 关闭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文件不能解决问题)