为什么 Eclipse 的索引器可以识别某些 类,而不能识别其他的?

Why does Eclipse's indexer recognize some classes, but not others?

我设置了 Eclipse C++ - 版本:Neon Release (4.6.0) - 构建 ID:20160613-1800 - 使用 GNU gcc ARM 嵌入式工具链(不是 gcc4mbed)。该工具链工作得很好,但我 运行 在我的最新项目中遇到了一个涉及(我认为)Eclipse 索引器的问题。

如果我给出重现问题的步骤,我的问题应该很清楚了:

  1. 创建一些 class 和 #include "mbed.h"

  2. 声明一些 DigitalOut 类型的成员变量。请注意,Eclipse 可以很好地识别这一点,因为文本变为粗体,并且在与变量交互时代码完成工作正常。

  3. 再声明一个PwmOut类型的成员变量。请注意,Eclipse 无法识别这一点,文本不会变成粗体,并且代码完成功能不起作用,因为 Eclipse 不知道 PwmOut 是什么。 Eclipse 说:

Errors (1 item)

Type 'PwmOut' could not be resolved. - main.cpp - Semantic Error

  1. 构建项目成功完成,编译器未抛出任何错误,即使 Eclipse 仍无法识别 PwmOut。二进制文件在我的 LPC1768 上运行正确。

Eclipse怎么可能识别出DigitalOut却识别不出PwmOut呢?两者都列在 mbed.h 内的同一代码块中——并且 DigitalOut.h 与 PwmOut.h.

在同一目录中

如果有帮助,here is an example project 我从 developer.mbed.org 中导出,您可以将其作为现有 Makefile 项目导入到 Eclipse C++ 中。

我已经尝试调整我发现的建议,例如在 Project->Properties->C/C++ General->Paths and Symbols->Includes 中添加带有这些 headers 的目录,重建索引,以及“刷新”索引中的所有文件。我只是无法让 Eclipse 识别它们。

编辑:我想补充一点,如果我单击“问题”window 中的“类型 'PwmOut' 无法解析”错误消息,Eclipse 会锁定一些时间秒,然后因堆栈溢出而崩溃。

很抱歉,我的解决方案可能不是很通用或对其他人的 Eclipse C++ 问题没有帮助。

解决方案:

  1. 在您的 developer.mbed.org 导出项目文件夹中,找到位于

    的 mbed 子目录中的文件 "device.h"
    ./mbed/TARGET_LPC1768/TARGET_NXP/TARGET_LPC176X/TARGET_MBED_LPC1768/device.h
    

我的差不多是空的。

  1. 将此 device.h 替换为 LPC1768 的 one located at the mbed official repo

注意这个 device.h 有更多的细节。

  1. 重建 Eclipse 的索引。 Eclipse 现在应该很高兴了。

我对这解决 Eclipse 问题的原因的解释:

当您从 developer.mbed.org 导出项目时,它会为您提供一个包含所有源代码的 zip 文件,以及一个包含 header 文件和 objects 用于您正在使用的特定微控制器。

大多数 NXP/ARM 的控制器应该有一些 DigitalOut 或 DigitalIn class 的变体,因为这种功能对于控制器来说是非常基本和常见的。然而,这个特殊的芯片(LPC1768)有一个独立的板载模块来处理脉冲宽度调制。此模块可能无法在所有 NXP/ARM 的芯片上找到,因此您可以将此视为我们在 IDE 中设置工作区环境时需要注意的特殊情况,例如 Eclipse .

特别是,mbed 导出的项目包含一个 header 位于(对我而言)在

./mbed/TARGET_LPC1768/TARGET_NXP/TARGET_LPC176X/TARGET_MBED_LPC1768/device.h

此设备header应该定义特定于您正在编程的设备的预处理器指令。我的是空的,but the one at the official repo for the LPC1768 里面有很多这个控制器的#defines。只要 device.h 中的 DEVICE_PWMOUT 指令定义为等于 1(确实如此),Eclipse 就会知道它应该识别 PwmOut class.