在QAC工具里,工程导入怎样设置,导入之后头文件又找不到该怎么处理,这两个问题经常是一起出现的。出现这类情况,一般不是因为工具本身不能分析代码,而是由于在导入工程的环节里,编译环境、头文件搜索路径、宏定义和源代码的目录结构没有被完整地带入,结果分析工具在处理源代码时,无法找到需要的头文件。把代码导入QAC工程,并不是简单理解为“把源文件加进来”,更为准确的说法是,要尽量让QAC还原出真实编译器所看到的那套环境。
一、QAC项目导入怎么设置
在开始分析之前,不要急着去点分析按钮,应当先把工程目录结构、编译器类型、检查规则配置以及源代码的纳入范围,一项一项地整理清楚。嵌入式工程尤其如此,因为源代码目录、驱动目录、中间件目录和芯片SDK目录常常分散在不同的位置,如果只把一个src子目录导进去,后面几乎都会出现头文件缺失的提示。
1、划定源代码目录和分析范围
导入工程之前,需要先看清哪些文件真正参与了编译过程,像src、app、driver、middleware、bsp这类目录可以重点纳进来,而像build、output、generated这些存放临时文件的目录,一般不必全部导入。
QAC主要用来分析C和C++的源代码,如果把无关的文件、历史备份、自动生成却不参与编译的内容也一并放了进去,后续分析产生的提示信息就会变得混乱,头文件的查找路径也更不容易梳理清楚。
2、挑选合适的编译器配置
打开工程属性界面以后,要检查编译器选择区域的相关设置,确认工具所启用的编译器配置模板,和实际工程编译时使用的编译器尽量保持一致。
不同的编译器,在内置宏、系统头文件路径以及扩展语法的处理上都有差别,要是工程本来是用GCC、IAR、Keil或者Green Hills来编译的,却在QAC里选错了编译器模板,后面就可能涌现大量的解析错误。在工程属性中,既可以指定工程使用的编程语言,也可以在编译器选择区域里启用对应的编译器配置项。
3、补全规则文件和分析配置
QAC一般需要搭配规则配置文件来使用,工程导入之后,要核对一下启用的规则集是不是企业所要求的版本,比如MISRA C、MISRA C++、CERT,或者是公司内部裁剪过的规则文件。
4、优先采用构建过程捕获的方式
当工程的结构比较复杂时,更推荐的做法是借助构建过程把编译信息捕获下来,而不是用手工逐条添加源代码目录的方式去操作。
QAC的图形界面具备监视构建过程的能力,通过在工具里触发一次真实的编译动作,就能识别出哪些文件参与了编译、使用了哪些头文件路径以及其他编译细节。
二、QAC项目导入后头文件找不到怎么办
头文件找不到,是QAC导入之后很常见的情况,表现的形式可能是提示“cannot open include file”或者“No such file or directory”,也可能是某个芯片寄存器定义、RTOS头文件、第三方库头文件解析失败。处理这类问题的时候,不要只盯着报错的文件名,应当按照包含路径一层一层往上去查。
1、先判断缺少的是哪一类头文件
假如缺少的是工程自己内部的头文件,像app_config.h、board.h、xxx_driver.h这些,那么多半是工程的头文件搜索路径没有被加完整。如果缺少的是编译器或者系统自带的头文件,例如stdint.h、stddef.h、intrinsics.h,这时候就需要检查编译器配置模板、内置包含目录以及编译环境的设定;倘若缺少的是第三方库提供的头文件,比如RTOS、TCP/IP协议栈、芯片SDK里面的头文件,就要把对应库的头文件目录补充到工程属性里面去。
2、在工程属性里补充头文件搜索路径
打开工程属性之后,在分析相关的设置项中,把工程级别的头文件搜索路径填充完整,需要添加的是缺失头文件所在的上一级目录,而不是直接添加某一个头文件本身。例如,源代码里写了#include"driver/gpio.h",那么补充的路径就应该指向能够看到driver这个子目录的那一级目录。帮助文档同样说明,工程级别的头文件搜索路径和宏定义,可以在工程属性的分析页面里进行配置。
3、注意路径写法和不同操作系统的差异
(1) 在Windows环境下,路径可能写成D:projectsdkinclude的样子;
(2) 而在Linux环境下,则写成/home/user/project/sdk/include。
如果把工程从一台电脑复制到另一台,之前配置的绝对路径很容易就会失效。因此,更稳妥的做法是尽量使用相对路径,或者统一用工程根目录变量来表示。在头文件搜索路径的选项里,Linux环境通常用-I作为参数,Windows环境常用/I,多数情况下默认的参数设置已经够用,但遇到某些特殊的编译器,可能还需要补充额外的参数。
三、让工程配置稳定下来的方法
QAC工程并不是导入一次就结束了,尤其在团队协作的项目里,后续可能还会切换分支、升级SDK、更新编译脚本,所以工程的配置要尽量做到可复用,否则今天手工调整好了,过几天换一位同事打开,同样的头文件问题可能又会再次出现。
1、对照真实的编译命令进行核验
一种比较可靠的做法,是把QAC工程里的头文件搜索路径和宏定义,跟真实编译命令里出现的-I、/I、-D参数逐一对照,检查有没有漏掉。不能只依靠集成开发环境左侧目录树里能看到的文件来做判断,因为在开发环境里能看到的文件,并不等于QAC在分析时就能按照同样的路径找到它。
2、按照模块分类来整理路径
工程里的头文件路径不要全部堆在一起,可以按照app、bsp、driver、middleware、third_party、compiler这样的模块思路分别归置好。这样一来,后面再遇到报错的时候,就能快速地分辨出,到底是业务代码的路径没有加全,还是底层驱动、芯片支持包、第三方库的目录没有被包含进来。
3、避免把无关的目录加得太多
有的人在碰到头文件找不到时,会把工程的根目录、甚至整个磁盘上的SDK目录全部添加进去,短期内可能不再报缺失,但这样做会带来另一个麻烦:如果存在同名的头文件,工具可能会匹配到错误的那一个,从而导致分析结果变得不稳定。正确的做法是缺什么就补什么,一直补到刚好能覆盖真实的编译环境为止。
总结
设置QAC工程导入的关键,不在于简单地把源代码装进工程,而是要尽可能还原出真实的编译环境;对于导入后头文件找不到的情况,排查的顺序也比较清晰——先判断缺失的是哪种头文件,接着补充相应的头文件搜索路径,再检查编译器配置和宏定义,最后与真实的编译命令进行核对。只要按照这个顺序把思路理清,大多数头文件找不到的问题都能够比较快速地定位,不必一上来就去怀疑源代码的目录结构本身出了差错。