我正在使用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__)
,并解析正确的特定于设备的标头,这在这里没有发生。对我来说至关重要的是,代码完成必须起作用,因为嵌入式项目需要整天键入深奥的寄存器和端口名宏。
我想念什么?
makefile和makefile 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/