我正在使用QtCreator在C中启动嵌入式AVR项目。

我相信我已完成所有设置并正常工作;我可以从avr-libc编写#include头文件的代码,并使用自定义makefile进行构建,然后二进制文件会自动为我刷新到芯片上。不幸的是,即使我的代码在没有来自avr-gcc的任何警告的情况下进行编译,QtCreator的ClangCodeModel插件也无法识别#define的端口和注册名称的子集-它声称存在错误,并且自动补全功能不起作用。



我认为我已经确定了问题所在:

AVR项目中的样板#include是#include <avr/io.h>。 io.h本身#include是无条件的其他许多标头,例如定义所有AVR设备通用的寄存器名的标头。代码完成功能确实可以使用这些标头中定义的名称正常工作。但是,它还根据您要定位的特定AVR设备有条件地包含另一个报头。那里有数百个AVR设备,每个设备都有自己的头文件,该文件定义端口和寄存器名称。 io.h确定像这样包含哪个:

#if defined (__AVR_AT94K__)
#  include <avr/ioat94k.h>
#elif defined (__AVR_AT43USB320__)
#  include <avr/io43u32x.h>
#elif defined (__AVR_AT43USB355__)
#  include <avr/io43u35x.h>
#elif defined (__AVR_AT76C711__)
#  include <avr/io76c711.h>
.
.
.


等等。我的理由是,尽管ClangCodeModel确实显示了错误标签,但由于编译不会引发任何错误,因此实际上必须包含正确的标头。我的意思是,我可以编写引用特定于设备的寄存器名称的代码,并且可以毫无问题地进行编译,但是ClangCodeModel无法识别该寄存器名称。

编辑:请注意,如果我实际上直接在main.c的顶部直接#include <avr/iom328p.h>,则ClangCodeModel会解析标头,并且自动完成工作。不幸的是,我实际上不能那样做。从:


  该头文件包含适用于
      -mmcu =编译器指定的设备
      命令行开关。这是通过转移到适当的
      文件应该
      永远不要直接包括在内。一些通用的寄存器名称
      AVR设备直接在中定义,
      它包含在中,
      但大多数细节来自各自的包含文件。


并来自:

/* This file should only be included from <avr/io.h>, never directly. */




ClangCodeModel documentation


  通过警告和错误标记获得的反馈与
  编译器会给您,而不是不完整的集合或关闭
  近似值,例如使用内置Qt Creator代码模型时。


事实并非如此。对我来说,这种说法意味着ClangCodeModel将继续进行评估,并评估#if defined (__MY_AVR__),并解析正确的特定于设备的标头,这在这里没有发生。

对我来说至关重要的是,代码完成必须起作用,因为嵌入式项目需要整天键入深奥的寄存器和端口名宏。

我想念什么?



makefilemakefile referenced at the bottom include

The general <avr/io.h>.

The device-specific header <avr/iom328p.h> which has all the names I need, and ClangCodeModel is failing to parse.

Contents of QtCreator's MyProjectName.includes (I added these lines manually).

最佳答案

您应该添加

#define __AVR_ATmega328__


到您的MyProjectName.config文件。
QtCreator的代码模型无法获取所有编译器定义,因为Makefile不是由qmake,cmake或qbs生成的。

关于c - Qt Creator ClangCodeModel无法解析或自动完成条件嵌套包含吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44782234/

10-12 16:05