深入解析KEIL MDK工程中头文件包含路径的细节和使用方法
单片机嵌入式爱好者 2023-08-03

文章目录

  • 前言

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

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

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

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

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

  • 总结

前言

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

首先在windows环境下:

“ .\ ”表示当前目录

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

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

依次类推

一、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所在目录的相对目录)
  1. 【A目录:优先级1】..\..\Libraries\CMSIS\Include

  2. 【B目录:优先级2】..\..\Libraries\STM32F4xx_HAL_Driver\Inc

  3. 【C目录:优先级3】..\..\Libraries\STM32F4xx_HAL_Driver\Src\Legacy

  4. 【D目录:优先级4】..\..\Libraries\CMSIS\Device\ST\STM32F4xx\Include

  5. 【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



声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
下载排行榜
更多
评测报告
更多
广告