2016-09-18 50 views
0

我设置Eclipse C++ - 版本:Neon版本(4.6.0) - 版本ID:20160613-1800 - 使用GNU gcc ARM嵌入式工具链(而不是gcc4mbed)。工具链很好用,但是我遇到了一个涉及(我认为)Eclipse最近项目的索引器的问题。为什么Eclipse的索引器识别一些类,但不识别其他类?

  1. 创建一些类的#include“mbed.h”

  2. 声明类型DigitalOut的一些成员变量:如果我给我的重现问题的步骤

    我的问题应该是清楚的。请注意,Eclipse认识到这一点很好,因为文本变成了粗体,并且在与变量交互时代码完成工作正常。

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

错误(1项)

类型 'PWMOUT' 无法解析。 - main.cpp中 - 语义错误

  • 构建项目成功完成,编译器不引发错误,尽管Eclipse中始终不承认PWMOUT。 Binary在我的LPC1768上正确运行。
  • Eclipse如何识别DigitalOut而不是PwmOut?两者都在mbed.h中的相同代码块中列出 - 而DigitalOut.h与PwmOut.h位于同一目录中。

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

    我试着调整我发现的建议,例如在项目 - >属性 - > C/C++常规 - >路径和符号 - >包括,重建索引和“清新”中的所有文件该指数。我无法让Eclipse识别它们。

    编辑:我想补充说,如果我点击“类型”PwmOut“无法解决”在“问题”窗口中的错误消息,Eclipse锁定了几秒钟,然后崩溃与堆栈溢出。

    +0

    要检查的一件事是在代码中未定义的makefile中定义的名称。 Codan可能认为'PwmOut'由于条件编译而被排除在外。 – user4581301

    +0

    @ user4581301感谢您的建议。你能澄清你的意思吗?这是当您从developer.mbed.org导出项目时随项目提供的Makefile的要点https://gist.github.com/yankee14/c73325c1ab035c167bc2b3c3117dfe09 – Yankee

    +0

    对不起,但我不会从互联网上下载匿名内容。你正在寻找的是在makefile的编译器规则中使用gcc编译器选项'-D'。这些通常用于通过指示编译器不编译代码区域来打开或关闭功能。例如'#ifdef DEBUG std :: cerr <<“调试信息\ n”#endif'。如果DEBUG已经在代码中使用'#define DEBUG'定义,或者在编译器命令行中使用'-D DEBUG'定义,则会打印“Debug Message”。请注意,这只是这个问题的一个常见解决方案。这可能不是你的解决方案。 – user4581301

    回答

    1

    我很抱歉地说我的解决方案可能不是很普遍或对其他人的Eclipse C++问题有帮助。

    解决方法:

    1. 在你developer.mbed.org导出的项目文件夹,找到文件 “device.h中” 设在mbed子目录

      ./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一个项目,它可以让你与所有源的拉链,以及一个” ./ mbed“目录,其中包含您工作的特定微控制器的头文件和对象。

    恩智浦/ ARM的大多数控制器应该具有DigitalOut或DigitalIn类的一些变体,因为这类功能对于控制器来说非常基本和通用。但是,这个特定的芯片(LPC1768)在板上有一个独立的模块来处理脉宽调制。在所有恩智浦/ ARM芯片上都未找到此模块,因此您可以将其视为在IDE(例如Eclipse)中设置工作区环境时需要注意的特殊情况。

    特别是,mbed导出的项目包括位于(对我来说)一个头标,

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

    该器件的头应该定义特定于正在编程装置预处理指令。矿是空的,but the one at the official repo for the LPC1768有很多#defines在这个控制器。只要device.h中的DEVICE_PWMOUT指令被定义为等于1(它是),Eclipse就会知道它应该识别PwmOut类。

    +0

    device.h文件已被弃用,因此它现在几乎为空,并且所有目标信息都位于targets.json文件中 - >您已经注意到,宏是通过包含所有DEVICE_定义的-D定义的。 你可以提出这个作为mbed-os github存储库的一个改进,我们应该生成带有设备配置的头文件(这里有mbed配置,但是对于其他的)。 – c0170

    +0

    @ c0170谢谢您的建议,我提交了改进https://github.com/ARMmbed/mbed-os/issues/2738 – Yankee