KEIL MDK 工程中头文件包含的路径详解

(参考工程详见https://download.csdn.net/download/tianzhijiaoxin/87464281


前言

在使用Keil MDK开发stm32或者C51嵌入式应用时,经常涉及到工程模块化的应用,其中头文件的路径及包含问题是一个重要的细节,涉及工程架构的清晰及编译的快慢。

首先在windows环境下:

“ .\ ”表示当前目录

“ ..\ ”表示当前目录的上1级目录

“ ..\ ..\ ”表示当前目录的上2级目录

依次类推

(参考工程详见https://download.csdn.net/download/tianzhijiaoxin/87464281


一、include<***.h>与include"***.h"的区别

#include "***.h"     表示用户自定义目录, 编译器查找顺序:【当前.c目录】->【 C/C++中 IncudePaths中的目录】->【Keil系统目录,例如D:\Keil_v5\ARM\ARMCC\include】

#include <***.h>   表示直接从系统目录查找, 编译器查找顺序:【Keil系统目录,例如D:\Keil_v5\ARM\ARMCC\include】->【当前.c目录】->【 C/C++中 IncudePaths中的目录】


二、C/C++中 IncudePaths中的目录的说明

IncudePaths中的所有目录都是以MDK工程(***.uvprojx)所在目录的相对目录


三、头文件加载的方式(<***.h>与"***.h"通用)

1.通过当前源程序.c当前目录寻找***.h

  • 当在.c文件中使用include"ccc.h"//ccc.h存在于:当前.c目录(即.c与ccc.h处于同一目录里面)
  • 当在.c文件中使用include"bbb\ccc.h"//ccc.h存在于:当前.c目录下面bbb文件夹里面
  • 当在.c文件中使用include"aaa\bbb\ccc.h"//ccc.h存在于:当前.c目录下面aaa文件夹里面的bbb文件夹里面
  • 当在.c文件中使用include"..\ccc.h"//ccc.h存在于:当前.c目录上1级目录里面
  • 当在.c文件中使用include"..\..\ccc.h"//ccc.h存在于:当前.c目录上2级目录里面
  • 当在.c文件中使用include"..\..\bbb\ccc.h"//ccc.h存在于:当前.c目录上2级目录里面bbb文件夹里面
  • 当在.c文件中使用include"..\..\..\aaa\bbb\ccc.h"//ccc.h存在于:当前.c目录上3级目录里面aaa文件夹里面的bbb文件夹里面

无论那种方式去寻找ccc.h时,首先都是以.c文件所在目录寻找ccc.h的相对路径

当编译器使用.c当前目录找不到ccc.h时,编译器开始自上而下使用C/C++中 IncudePaths中目录逐条溯源寻找

2.通过C/C++中 IncudePaths中的目录逐条寻找***.h

例如C/C++中 IncudePaths中的目录如下:(都是***.uvprojx所在目录的相对目录)

【A目录:优先级1】..\..\Libraries\CMSIS\Include
【B目录:优先级2】..\..\Libraries\STM32F4xx_HAL_Driver\Inc
【C目录:优先级3】..\..\Libraries\STM32F4xx_HAL_Driver\Src\Legacy
【D目录:优先级4】..\..\Libraries\CMSIS\Device\ST\STM32F4xx\Include
【E目录:优先级5】..\..\..\V5-002
  • 当在.c文件中使用include"ccc.h"//ccc.h存在于:编译器首先去A目录里面寻找,找不到,

编译器再去B目录里面寻找,找不到,

编译器再去C目录里面寻找,找不到,

编译器再去D目录里面寻找,找不到,

编译器再去E目录里面寻找,找不到,那就真是【error: #5: cannot open source input file "ccc.h": No such file or directory】

  • 当在.c文件中使用include"bbb\ccc.h"//ccc.h存在于:编译器首先去A目录bbb文件夹里面寻找,找不到,

编译器再去B目录bbb文件夹里面寻找,找不到,

编译器再去C目录bbb文件夹里面寻找,找不到,

编译器再去D目录bbb文件夹里面寻找,找不到,

编译器再去E目录bbb文件夹里面寻找,找不到,那就真是【error: #5: cannot open source input file "bbb\ccc.h": No such file or directory】

  • 当在.c文件中使用include"aaa\bbb\ccc.h"

//ccc.h存在于:编译器首先去A目录aaa文件夹里面bbb文件夹里面寻找,A目录aaa文件夹里面bbb文件夹里面找不到,

编译器再去B目录aaa文件夹里面bbb文件夹里面寻找,找不到,

编译器再去C目录aaa文件夹里面bbb文件夹里面寻找,找不到,

编译器再去D目录aaa文件夹里面bbb文件夹里面寻找,找不到,

编译器再去E目录aaa文件夹里面bbb文件夹里面寻找,找不到,那就真是【error: #5: cannot open source input file "aaa\bbb\ccc.h": No such file or directory】

  • 当在.c文件中使用include"..\ccc.h"

//ccc.h存在于:编译器首先去A目录上1级里面寻找,找不到,

编译器再去B目录上1级里面寻找,找不到,

编译器再去C目录上1级里面寻找,找不到,

编译器再去D目录上1级里面寻找,找不到,

编译器再去E目录上1级里面寻找,找不到,那就真是【error: #5: cannot open source input file "..\ccc.h": No such file or directory】

  • 当在.c文件中使用include"..\..\ccc.h"

//ccc.h存在于:编译器首先去A目录上2级里面寻找,找不到,

编译器再去B目录上2级里面寻找,找不到,

编译器再去C目录上2级里面寻找,找不到,

编译器再去D目录上2级里面寻找,找不到,

编译器再去E目录上2级里面寻找,找不到,那就真是【error: #5: cannot open source input file "..\..\ccc.h": No such file or directory】

  • 当在.c文件中使用include"..\..\bbb\ccc.h"

//ccc.h存在于:编译器首先去A目录上2级里面bbb文件夹寻找,找不到,

编译器再去B目录上2级里面bbb文件夹寻找,找不到,

编译器再去C目录上2级里面bbb文件夹寻找,找不到,

编译器再去D目录上2级里面bbb文件夹寻找,找不到,

编译器再去E目录上2级里面bbb文件夹寻找,找不到,那就真是【error: #5: cannot open source input file "..\..\bbb\ccc.h": No such file or directory】

  • 当在.c文件中使用include"..\..\..\aaa\bbb\ccc.h"

//ccc.h存在于:编译器首先去A目录上3级里面aaa文件夹里面bbb文件夹寻找,找不到,

编译器再去B目录上3级里面aaa文件夹里面bbb文件夹寻找,找不到,

编译器再去C目录上3级里面aaa文件夹里面bbb文件夹寻找,找不到,

编译器再去D目录上3级里面aaa文件夹里面bbb文件夹寻找,找不到,

编译器再去E目录上3级里面aaa文件夹里面bbb文件夹寻找,找不到,,找不到,那就真是【error: #5: cannot open source input file "..\..\..\aaa\bbb\ccc.h": No such file or directory】

无论那种方式去寻找ccc.h时,首先都是***.uvprojx所在目录的相对目录


总结

Keil MDK中头文件包含的方式很灵活:

  1. 直接当前目录寻找
  2. 相对当前目录寻找【溯源+拼接】
  3. 直接IncudePaths目录寻找
  4. 相对IncudePaths目录寻找【溯源+拼接】
  5. 直接Keil MDK系统目录寻找,例如D:\Keil_v5\ARM\ARMCC\include

(参考工程详见https://download.csdn.net/download/tianzhijiaoxin/87464281

  • 14
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值