使用Eclipse 4.4.2在C代码中使用构建变量

时间:2016-01-14 02:08:15

标签: c eclipse eclipse-cdt

我有一个我之前使用Eclipse 3.5.2创建的项目。在其中,我能够在项目属性中设置构建变量。在这种情况下,假设我将SW_VERSION设置为4403.现在这是一个十六进制数,所以在Build Settings中,我添加了一个Symbol "VERSION=0x${SW_VERSION}"条目。然后在我的代码中,我能够使用VERSION作为常规数字,如下所示:

unsigned int vers = VERSION;

没有问题,vers获得了值0x4403

现在我正在使用Eclipse版本4.4.2,我正在使用一些新功能更新我的项目。但首先我只是尝试使用新的工具链重新编译我的旧项目,虽然我在控制台上没有收到任何消息,但在“问题”选项卡中我收到3条警告:

Symbol 'SW_VERSION' could not be resolved
Symbol '$' could not be resolved
Statement has no effect 'VERSION'

我还没有尝试过运行已完成的项目,但这关系到我,我不得不假设它实际上不会像过去那样工作。在较新的Eclipse中是否有一些不同的方法可以做到这一点,或者这个功能刚刚消失了吗?

作为旁注,我有理由这样做。我还将SW_VERSION的值附加到我的工件名称的末尾。那部分至少仍然有效。

2 个答案:

答案 0 :(得分:2)

Indexer(CDT解析器)看到你的VERSION宏并将其扩展为0x $ {SW_VERSION} 但是没有评估它所以它将它传递给预处理器,因为它是未扩展的, 这些警告来自静态代码分析,不会影响您的二进制文件。但是,因为看到你必须通过仅为索引器定义VERSION宏来强制索引器正确看到这个宏,这很烦人

  • 项目属性 - > C / C ++ General->预处理器..->
  • 选择GNU C(或您使用的任何语言变体) - >
  • 选择CDT用户设置条目
  • 单击添加...并添加“预处理器宏”VERSION = 1

你放在那里的数字并不重要,因为它不在你的二进制文件中,只是用于语法分析。

答案 1 :(得分:1)

你说:

  

如果它实际上无法分析代码实际上是什么,那就会使事情变得毫无意义。我做了这个并且它有效,但它使弹出宏扩展显示这个假值而不是真实的东西。

但是我打赌在Eclipse 3.5.2中,弹出的宏扩展甚至不会出现在VERSION中。

换句话说,索引器从不正确解析VERSION。我相信在Eclipse 3.7中唯一改变的是,索引器错误开始在UI中出现,我为什么你会开始看到像Symbol '$' could not be resolved这样的错误。

现在,关于解决您的问题:是否启用了构建输出解析器(Project Properties -> C/C++ General -> Preprocessor Include Paths, Macros etc. -> Providers tab -> <Your Toolchain> Build Output Parser)?

它应该能够通过解析构建的输出来获取索引器的VERSION的正确值,包括编译器调用(可能包含${SW_VERSION}的扩展值,否则编译不起作用。)

我对生成的makefile项目没有太多经验(我编写自己的makefile),但我认为构建输出解析器也适用于它们。