【问题标题】:How can I convince Eclipse CDT that a macro is defined for source code editing and code completion?如何让 Eclipse CDT 相信宏是为源代码编辑和代码完成定义的?
【发布时间】:2013-08-15 10:56:12
【问题描述】:

我的源代码中有:

// foo.cpp
struct foo
{
  foo() {}

  #ifdef I_WANT_THIS_FEATURE
  void bar() {}
  #endif
};

在我的 Makefile 中有

foo.o: foo.cpp
        g++ -c -DI_WANT_THIS_FEATURE foo.cpp -o foo.o

这可以从命令行以及我在 Eclipse 中创建的外部构建器(它基本上定义了一些环境变量并调用make)编译得很好,我可以调用foo::bar()

但是,在 Eclipse CDT 源代码编辑器中,我定义 foo::bar() 的部分具有灰色背景(表明 foo::bar() 不会包含在构建中)并且 foo 类型的对象的代码完成确实不建议将bar()作为可以调用的方法。

如何使用自定义 makefile 在 Eclipse CDT makefile 项目中定义 I_WANT_THIS_FEATURE 宏,以便源代码编辑器和代码完成知道它?

【问题讨论】:

标签: eclipse indexing eclipse-cdt eclipse-juno


【解决方案1】:

Eclipse 让这变得相当混乱,因为有多个地方可以设置它,并且设置是耦合的,但它是这样工作的:

为给定项目设置自定义宏(影响 Eclipse 中的构建和索引)

这是我的首选方式。

在本例中,我们将在 Eclipse 项目级别(为其索引器和构建器)设置以下定义,而不是在您的源代码中。

#define ARDUINO 1000
#define AVR
#define __AVR_ATmega328__

如果您在手动构建gccg++ 项目时在命令行中定义它们,上面的#defines 将如下所示(在man gcc 页面中搜索-Dmacro 以获取详细信息):

-DARDUINO=1000 -DAVR -D__AVR_ATmega328__

所以,在您的 Eclipse 项目中执行以下操作。我在这里的项目称为“Arduino 1.8.13”(请参阅​​下面这几张图片的完整截图):

在左侧的“项目资源管理器”窗格中右键单击您的项目 --> 属性 --> C/C++ 常规 > --> Paths and Symbols --> Symbols 选项卡 --> 选择 GNU CGNU C++ --> 点击右上角的添加按钮 --> name输入ARDUINOvalue输入1000 -- > 请务必选中 添加到所有配置添加到所有语言 的 2 个框(除非您不想要这些行为)--> 单击 确定.

对所有定义重复此步骤,如下所示。请务必为每个选项选中添加到所有配置添加到所有语言(除非您不希望这些行为)复选框:

  1. 名称:ARDUINO,值:1000
  2. 名称:AVR,值:(留空)
  3. 名称:__AVR_ATmega328__,值:(留空)

这是显示第一个的屏幕截图。注意所有突出显示的部分以单击或注意:

为所有要定义的宏(例如:上面的 3 个)完成此操作后,您将看到以下内容:

  1. 如果您为每种语言选中了添加到所有语言,那么这些宏将同时应用于 GNU CGNU C++ 语言。因此,单击一个,然后单击另一个,您应该会在两个位置看到宏,如下所示:
  2. 如果您为每一项都选中了添加到所有配置复选框,那么这些宏也将应用于所有构建“配置”,例如 Debug发布,如下图:
  3. 请记住,“语言”和“配置”的所有各种组合都是独一无二的。如果在添加宏时未选中添加到所有配置添加到所有语言这两个框,您可以为每个配置单独设置一种或两种语言的宏.
  4. 如果您导航到 项目属性 --> C/C++ 构建 --> 设置 --> 工具设置 选项卡 --> Cross GCC Compiler --> Preprocessor 在构建或索引时,您还会看到现在为所有“GCC”C 文件定义了这些宏!:
    请注意,您还可以在此处编辑、添加或删除特定于给定“配置”或“语言”(此特定位置适用于 GNU C 语言)的宏,而不是像上面之前所做的那样, 如果你喜欢。 但是,将给定宏同时应用于所有语言和所有构建配置的唯一方法就是按照我在上面向您展示的方式进行操作。
  5. 如果您导航到 Project Properties --> C/C++ BuildGNU C++ 构建和索引设置/strong> --> 设置 --> 工具设置选项卡 --> Cross G++编译器 --> 预处理器:
    同样,要为 C++ 自定义宏并且仅针对此选定的“配置”,您可以在此处对其进行编辑。

添加完所有宏后,点击应用应用并关闭。询问时,选择 YES 以重新索引整个项目:

如果您没有点击YES,您可以手动触发项目重新索引,方法是在项目资源管理器中右键单击它并转到 --> 索引 --> 重建

疑难解答

如果您的设置/宏似乎没有被应用,并且您的代码仍然显示部分被涂黑,表明这些部分的宏是错误的或未定义的,您可能需要执行或检查以下操作:

  1. 尝试通过在项目资源管理器中右键单击项目并转到 --> 索引 --> 重建来重新索引您的项目。
  2. 您可能没有为正确的构建配置或语言设置宏。正如我在上面的各种屏幕截图中所示,您将需要检查所有各种构建配置和语言。
    1. 按照上面的说明重新添加宏,这次一定要选中 添加到所有配置添加到所有语言的 2 个框。。李>
    2. 或者,手动导航到 Project Properties --> C/C++ Build --> Settings --> Tool设置 标签 -->
      1. --> 跨 GCC 编译器 --> 预处理器 OR
      2. --> 跨 G++ 编译器 --> 预处理器...
    • ...部分手动配置宏仅用于一种语言和/或配置,或另一种。所有这些设置必须同步或单独设置。
  3. 如上所述,设置这些设置最简单的地方是:右键单击您的项目,在左侧的“项目资源管理器”窗格中 --> 属性 --> C/C++ 常规 --> 路径和符号 --> 符号选项卡。但是,如果您忘记选中 添加到所有配置添加到所有语言 复选框,我建议您删除宏然后再次添加它们,这次检查那些盒子。
  4. 如果您不想担心选择了哪个构建配置,并且在添加宏时没有选中添加到所有配置框,您也可以更改此全局工作区设置,但我不太推荐:
    Window --> Preferences --> C/C++ --> Indexer --> 选择 Use active build configuration。但是,我自己也不使用此选项,也不一定建议您使用它。这只是需要注意的事情。

另见

  1. 这个答案也发布在我的网站上:https://gabrielstaples.com/eclipse-defining-custom-macros-for-indexer/
  2. 我的完整 Eclipse 设置文档在这里:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/tree/master/eclipse

【讨论】:

    【解决方案2】:

    找到它:Project -> Properties -> C/C++ General -> Paths and Symbols

    选择 Symbols 标签并添加... 一个具有 Name I_WANT_THIS_FEATUREValue 的新 Symbol >1

    【讨论】:

    • 我认为问题是关于自动解析 makefile 中的定义,然后使用它们为源代码的启用和禁用部分进行索引和代码突出显示。
    • 您还应该选中 Add to all configurationsAdd to all languages 的复选框。
    【解决方案3】:

    除了奥斯瓦尔德的回答:

    如果您有多个构建配置,Eclipse Indexer 的默认行为似乎是它始终使用第一个构建配置。

    在我的例子中,定义只在第三次构建配置中定义,所以 Oswald 提供的解决方案没有帮助。

    要全局更改此设置,请选择 Window -> Preferences -> C/C++ -> Indexer。 选择使用主动构建配置

    您还可以选择覆盖项目 -> 属性 -> C/C++ 常规 -> 索引器下项目设置中的全局设置,然后选择启用项目特定设置然后选择Use active build configuration

    在此之后,奥斯瓦尔德提供的解决方案应该可以工作:

    项目 -> 属性 -> C/C++ 常规 -> 路径和符号

    选择符号选项卡并添加...一个名为 I_WANT_THIS_FEATURE 且值为 1 的新符号。

    【讨论】:

    • 看来,如果您在首先添加符号时选中 Add to all configurationsAdd to all languages 的框,则不需要像您指定的那样同时选中 Use active build configuration,因为该符号将添加到所有构建配置中。
    【解决方案4】:

    几乎所有编译器都使用 -D 并且只提供一个像 -DI_WANT_THIS_FEATURE 这样的名称来定义符号 I_WANT_THIS_FEATURE 的值为 1。

    eclipse 索引器/编辑器显然不知道,所以:

    #if I_WANT_THIS_FEATURE
    this code is marked inactive in editor,
    but will be seen by compiler and cause error
    #endif
    

    地点:

    #ifdef I_WANT_THIS_FEATURE
    this code is marked active in editor
    #endif
    

    所以,Eclipse 不知道通过 -D 定义的符号的默认值为 1,这确实是一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 2011-07-21
      • 2015-09-26
      • 2021-12-27
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      相关资源
      最近更新 更多