做STM8工程时,最让人头疼的不是代码本身,而是项目明明能打开,一编译却连续报错。有时是找不到头文件,有时是链接阶段缺库,还有一种更常见,就是项目从别人电脑拷过来以后,路径设置全都还在,但本机就是编不过。IAR针对STM8的工具链本身把标准头文件和预编译库分得很清楚,头文件主要在stm8inc,预编译库和对应的库配置文件主要在stm8lib;再加上IDE里编译器和链接器的路径入口本来就不是同一个位置,所以这类问题不能只看报错字面,得顺着编译阶段和链接阶段分别往下查。
一、IAR STM8编译报错
遇到编译报错时,别一上来就重装软件。STM8工程里最常见的路径类问题,其实都能在项目选项里查到源头。先分清这是预处理阶段找不到头文件,还是链接阶段找不到库,排查会快很多。
1、先看报错发生在编译前半段还是链接后半段
如果报错里直接点名某个.h文件找不到,通常先查编译器的包含路径;如果前面编译都过了,最后在链接时报找不到目标文件、库文件或符号,再去查链接器和库配置。IAR官方文档对这两条线分得很清楚,头文件搜索属于编译器预处理范围,库文件搜索属于链接器范围。
2、头文件报错先查【Project】【Options】【C/C++Compiler】【Preprocessor】
STM8工程里,附加头文件目录的入口就在这里。官方IDE指南写明了,【Additional include directories】用于逐行填写要搜索的目录,而且这些目录会排在标准包含目录之前搜索。也就是说,只要你自己的驱动头文件、板级头文件或第三方组件目录没填进这里,编译器就很容易直接报找不到文件。
3、别把标准目录误关掉
有些工程为了做定制,会勾选【Ignore standard include directories】。这个选项一开,编译器和汇编器就不会再自动去标准包含目录找文件,标准库头文件也可能跟着失效。要是你发现连这类基础头文件都报错,先回来看这个选项是不是被打开了,往往比到处改路径更有效。
4、路径迁移后优先改成变量写法
如果项目是从别的电脑拷过来的,最容易出问题的是绝对路径。IAR在IDE里提供了参数变量,像$PROJ_DIR$、$EW_DIR$、$TOOLKIT_DIR$都可以直接用在路径里。官方说明里也专门建议在选项框里用这类变量,目的是减少对固定安装盘符和固定目录的依赖。
二、IAR STM8头文件与库路径怎么查
很多人查路径时,只盯着工程树里的文件列表看,这样其实不够。因为工程里能看到某个文件,不代表编译器和链接器在构建时真会按你想的那个顺序去找它。STM8这套工具链的头文件搜索顺序和库文件入口,官方文档都写得比较细,照着查会更稳。
1、先查头文件的实际搜索顺序
IAR对STM8编译器的头文件搜索顺序写得很明确。用尖括号包含的头文件,先查通过-I也就是【Additional include directories】指定的目录,再查C_INCLUDE环境变量指定的目录,最后才查工具链自动建立的系统包含目录;如果是双引号包含的头文件,还会先查当前源文件所在目录。这个顺序一旦弄清楚,很多同名头文件被错引的问题就容易定位了。
2、标准头文件和器件相关头文件先去安装目录查
官方IDE指南直接给了STM8安装目录的结构说明,其中stm8inc放的是标准C或C++库头文件,以及特定器件用的特殊功能寄存器头文件;stm8lib放的是预编译库和对应的库配置文件。也就是说,你要确认软件本体有没有缺文件,先看这两个目录最直接。
3、库路径不要只看库名,要看【General Options】【Library Configuration】
很多人以为只要在工程里选了某种运行库就够了,实际还得确认工程当前到底用了哪个库文件和哪个配置文件。IAR官方说明里提到,在【Library Configuration】页会直接显示当前实际使用的【Library file】和【Configuration file】。这个位置特别适合查“工程看着没问题,但运行库实际没选对”的情况。
4、自定义库再去查【Linker】【Library】【Additional libraries】
如果你项目里不是只用默认运行库,而是额外加了自己的.a或其他库文件,那就继续到链接器的【Additional libraries】里看。官方IDE指南写得很清楚,这里要求一行一个库,并且要写完整路径,也支持用$PROJ_DIR$和$TOOLKIT_DIR$这类变量。只要这里写的是旧机器路径,工程到了新电脑就很容易在链接阶段报错。
三、IAR STM8路径设置为什么总是反复出错
这类问题之所以反复出现,通常不是因为IAR不好用,而是项目路径、库配置和工程迁移习惯没有一起收住。STM8工程的路径错误看着像零碎小问题,实际上很容易在团队协作里来回放大,所以最好一次性把容易踩坑的地方改干净。
1、工程能打开不等于路径没问题
IAR会把很多设置跟着工程文件一起保存,所以项目能正常打开,只能说明工程文件本身没坏,不能说明当前机器上的包含目录、库目录和工具链目录都有效。尤其是换盘符、换安装目录之后,这种假正常很常见。这个判断是结合IAR对工程路径和参数变量的处理方式得出的。
2、头文件错和库错要分两次处理
编译器的【Preprocessor】管的是头文件目录,链接器的【Additional libraries】和运行库配置页管的是库文件与库配置。把这几件事混在一起改,往往越改越乱。先修头文件,再修库文件,顺序理清以后,很多连续报错其实是一串问题,不是同一个问题。
3、做项目模板时尽量少写绝对路径
官方本来就支持用$PROJ_DIR$、$EW_DIR$、$TOOLKIT_DIR$这些变量来替代固定目录。对STM8项目来说,自己板级代码放项目目录附近,用$PROJ_DIR$去引用;工具链自带文件走$TOOLKIT_DIR$或安装目录变量,这样项目迁移和多人协作时会轻松很多。
4、查不清时直接看库文件和配置文件显示框
如果你已经改过几轮设置,还是不确定当前工程到底在用哪套运行库,最省事的办法不是继续猜,而是回到【Library Configuration】页,直接看界面显示出来的【Library file】和【Configuration file】。官方把这两个显示框放在那里,本来就是为了让你核对当前实际生效的结果,而不是只看下拉选项名。
总结
IAR STM8编译报错,真正要先分清是头文件搜索问题还是库文件链接问题。IAR STM8头文件与库路径怎么查,核心也不是在工程树里盲翻文件,而是到【C/C++Compiler】【Preprocessor】里查附加包含目录,到【General Options】【Library Configuration】里看当前实际使用的库和配置文件,再到【Linker】【Library】里核对附加库路径。把这几处位置理顺以后,STM8工程里常见的找不到头文件、迁移后路径失效、链接阶段缺库这些问题,通常都能更快定位。