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中头文件包含的方式很灵活:
- 直接当前目录寻找
- 相对当前目录寻找【溯源+拼接】
- 直接IncudePaths目录寻找
- 相对IncudePaths目录寻找【溯源+拼接】
- 直接Keil MDK系统目录寻找,例如D:\Keil_v5\ARM\ARMCC\include
(参考工程详见https://download.csdn.net/download/tianzhijiaoxin/87464281)
更多推荐
所有评论(0)