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

2023-05-16

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

文章目录

  • 前言
  • 一、include<***.h>与include"***.h"的区别
  • 二、C/C++中 IncudePaths中的目录的说明
  • 三、头文件加载的方式(<***.h>与"***.h"通用)
    • 1.通过当前源程序.c当前目录寻找***.h
    • 2.通过C/C++中 IncudePaths中的目录逐条寻找***.h
  • 总结

前言

在使用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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 我的2048天创作纪念日

    距离发布第一篇博客竟然已经2048天了 不知不觉都已经这么长时间了啊 xff0c 真是岁月不饶人啊 随想 5年的时间 xff0c 这5年经历了硕士时期 xff0c 经历了毕业之后的第一份工作 xff0c 第二份工作 xff0c 第三份工作
  • 基于粒子滤波的SLAM(GMapping)算法分析

    本文是 Improved Techniques for Grid Mapping with Rao Blackwellized Particle Filters 的大致翻译 xff0c 难免有不通顺与错误的地方 xff0c 如有错误请指出
  • tf之static_transform_publisher

    tf xff1a transform xff0c ROS中管理3D坐标系变换的工具 只要告诉tf两个相关联坐标系的坐标变换信息 xff0c tf会帮你一直记录这个两个坐标系的坐标变换 xff0c 即使两个坐标系处于运动中 1 tf的命令行用
  • sensor_msgs/PointCloud2 Message

    sensor msgs PointCloud2 Message File sensor msgs PointCloud2 msg Raw Message Definition This message holds a collection
  • 安卓平台及windows平台上基于Gazebo仿真器的px4遥控控制

    这里写自定义目录标题 安卓平台及windows平台上基于Gazebo仿真器的px4遥控控制数据链路描述安卓平台简介安卓平台四旋翼无人机控制安卓平台固定翼无人机控制安卓平台无人车控制安卓遥控器实物控制 桌面平台遥控图形界面桌面平台四旋翼无人机
  • sitl_gazebo,px4模型matlab接口分析,gazebo与matlab联合仿真

    最近在使用matlab建立四旋翼控制程序 xff0c 奈何没有好的可视化仿真软件 xff0c 便想起px4的gazebo仿真环境 xff0c 使用matlab连接px4底层通信模型 xff0c 实现matlab在软件层面的可视化仿真 Gaz
  • 【体验】ESP32-CAM可能是最便宜的“监控”方案,ESP32-CAM程序下载调试

    生活新装备 NEW EQUIPMENT FOR LIFE 抱着试一试的心里 xff0c 买了ESP32 CAM xff0c xff08 你别说 还真对得起 我和RMB xff0c 看下边 xff0c 看下边 xff09 xff1a 当年玩S
  • 【树莓派】树莓派SD卡系统镜像系统备份方法

    微信关注 DLGG创客DIY 设为 星标 xff0c 重磅干货 xff0c 第一时间送达 先感谢漂移菌的技术支持 耐心 细致的帮我解决了一个困扰我很久的问题 树莓派系统备份问题 问题的提出 xff1a 树莓派各种版本系统 xff0c 各种软
  • 【笔记】可能是唯一能让天猫精灵方糖播放本地音乐的智能方案

    微信关注公众号 DLGG创客DIY 设为 星标 xff0c 重磅干货 xff0c 第一时间送达 前言 如上图所示 xff0c 我家也有个同款的天猫精灵方糖 xff0c 买了 xff08 好像是个奖品 xff09 好几年了 xff0c 利用率
  • C++做题网站

    今天小编带大家介绍一下我平时用的C 43 43 做题网站 1 洛谷 平时我发题解一般是选自这个网站 传送链接 xff1a 洛谷 2 黑猫OJ 里面的题很好 传送链接 xff1a 黑猫OJ 3 图灵编程OJ 我最开始用的做题网站 传送链接 x
  • ROS系列:第三章(二)

    系列文章目录 第一章 ROS概述与环境搭建 第二章 ROS通信机制 第三章 ROS通信机制进阶 第四章 ROS运行管理 第五章 ROS常用组件 第六章 机器人系统仿真 第七章 机器人系统仿真 第八章 机器人系统仿真 第九章 机器人系统仿真
  • 手把手系列--STM32H750移植FreeRTOS(二)--优化编译速度

    一 目的 在上一篇 手把手系列 STM32H750移植FreeRTOS 我们已经实现了在ArtPi开发板上使用FreeRTOS 在编译阶段我们发现整个编译过程特别慢 xff0c 那么如何优化编译速度呢 xff1f 本篇的主要目的就是优化整个
  • FreeRTOS如何判断当前上下文是在中断还是在线程环境中

    一 目的 很多小伙伴在使用FreeRTOS API时 xff0c 肯定看到过类似这样的接口 xff1a xSemaphoreGiveFromISR SemaphoreHandle t xSemaphore signed BaseType t
  • 手把手系列--STM32H750移植FreeRTOS(三)--获取CPU占用

    一 目的 在之前的博文中我们移植验证了STM32H750XBH6上运行FreeRTOS系统 xff0c 在实际项目开发中我们经常会遇到获取系统实时运行负载的情况 xff0c 进而对系统进行优化 手把手系列 STM32H750移植FreeRT
  • 【资料分享】工程师必备嵌入式资料合集

    对于许多电子工程师来说 xff0c 各种电路资料 xff0c 学习资料 xff0c 新新技术资料等等 xff0c 都有越多越好的 本篇帖子就为大家整理了一些比较受工程师欢迎的一些电路资料 如果你有心动的话 xff0c 不妨就来搜集一波吧 x
  • HTML网页Javascript跳转代码

    有时候咱们不希望在该页面出现一条长长的链接 xff0c 那就可以采用跳转页了 xff0c 以下是代码 lt html gt lt head gt lt meta http equiv 61 34 Content Type 34 conten
  • 一起尝试写一个自己的小软件

    一起尝试写一个自己的小软件 xff0c 有时候写个小软件 xff0c 会耗费一两个小时 xff0c 有时候耗费几个小时 xff0c 甚至几天 xff0c 但是在写小软件的过程中 xff0c 咱们都是沉浸在软件写好后的美妙体验中 xff0c
  • 网页被挂马了怎么办呢

    首先 xff0c 咱们了解一下网页挂马是什么意思 xff1a 网页挂马指的是把一个木马程序上传到一个网站里面然后用木马生成器生一个网马 xff0c 再上到空间里面 xff01 再加代码使得木马在打开网页时运行 xff01 接下来讲怎么办 如
  • 公司里最看重的是发展机会

    公司里最看重的是发展机会 xff0c 而不是现在的工资 xff0c 这是很多老板都喜欢说的 说的多了 xff0c 咱么那就相信了 虽然说 xff0c 很大程度上 xff0c 今后的日子怎么过 xff0c 取决于现在的想法和奋斗 xff0c
  • 处在八零末期,九零早期,缝隙中的人

    处在八零末期 xff0c 九零早期 xff0c 缝隙中的人 思想既可以与八零年代的人相似 xff0c 又有九零年代那种无法脱掉的稚气 这就是89年 90年出生的人 的特性

随机推荐

  • 马上就下班回家了,让我再写一篇

    马上就下班回家了 xff0c 让我再写一篇 xff0c 写博客让我突然静下来了 同时都纷纷离开了 快了 xff0c 快了 xff0c 马上写好了
  • 我知道自己的未来需要什么

    我知道自己的未来需要什么 xff0c 现在的路就在眼前 xff0c 争取一把 xff0c 奋斗一段时间 xff0c 未来光明坦途正在招手 下班了 xff0c 下次再来
  • 走马观花之《视觉SLAM十四讲》

    1 视觉SLAM 系统概述 SLAM 是Simultaneous Localization and Mapping 的缩写 xff0c 中文译作 同时定位与地图构建 它是指搭载特定传感器的主体 xff0c 在没有环境先验信息的情况下 xff
  • 硬件工程师必会模块之MOS管构成的基本门逻辑电路—看芯片手册框图必备技能

    本文你可以获得什么 xff1f MOS管构成的缓冲器Buffer和漏极开路们OD门是数字电路非常重要的概念 xff0c 怎么构成的 xff1b 反相器 xff0c 线与逻辑怎么玩 xff0c 又怎么用呢 xff1f 根据原理图 xff0c
  • 关于信号量的作用范围

    最近在搞信号量的时候产生了怀疑 xff0c 信号量的作用范围和信号量在任务的位置时候有关系呢 xff1f 答案是有的 xff0c 其实信号量的作用范围是指的从信号量开始到程序的跳转点为止 xff0c 比如一个任务中 xff0c 把信号量放在
  • UNIX 环境高级编程之我见

    UNIX环境高级编程 xff08 第二版 xff09 xff08 人民邮电出版社 xff09 美 W Richard Stevens amp Stephen A Rago 著 本书的主要结构分为以下几个部分 xff1a xff08 1 xf
  • xShell连接ubuntu不成功

    操作环境 xff1a xShell6 43 vm15 43 ubuntu18 04 xShell中以root身份连接虚拟机中的ubuntu时 xff0c 连接不上 xff0c 见下图 xff1a 密码输入的也是对的 xff0c 也能够双向p
  • mac brew install

    brew cask install myprogram base darren 64 Darren 2 project brew cask install docker Error Unknown command cask brew ins
  • mac/linux 系统批量计算文件md5命令

    find type f print0 xargs 0 md5
  • 链表-设计链表

    leetcode 707 设计链表 注意 xff1a 面向对象的思想 这是创建一个自己的链表 xff0c dummyhead和 size初始化都在构造函数中 xff0c 同时自己的链表类也需要定义自己的节点 struct LinkNode链
  • KVM虚拟机使用桥接方式时和宿主机无法通信的解决方案

    KVM虚拟机使用桥接方式时和宿主机无法通信的解决方案 应用场景 虚拟机客户机安装完成后 xff0c 需要为其设置网络接口 xff0c 以便和主机网络 xff0c 客户机之间的网络通信 事实上 xff0c 如果要在安装时使用网络通信 xff0
  • android 电池充电状态记录

    摘抄源码记录下 http androidxref com 9 0 0 r3 xref frameworks native include batteryservice BatteryServiceConstants h This file
  • python 输入三个变量,然后按小到大输出(解析)

    python 实例解析 xff08 1 xff09 vim 2 python py x 61 int input 39 please input x 39 y 61 int input 39 please input y 39 z 61 i
  • Linux系统调用Hook姿势总结

    http www cnblogs com LittleHann p 3854977 html 主题 Linux 相关学习资料 http xiaonieblog com post 61 121 http hbprotoss github io
  • 利用WireShark进行DNS协议分析

    一 准备工作 系统是Windows 8 1Pro 分析工具是WireShark1 10 8 Stable Version 使用系统Ping命令发送ICMP报文 二 开始工作 打开CMD exe键入 ping www oschina net
  • DNS协议详解及报文格式分析

    DNS协议详解及报文格式分析 Posted on 2017 06 18 by Jocent No Comments 目录 一 DNS协议理论知识 1 1 域名结构1 2 域名服务器1 3 域名解析过程 二 DNS协议报文格式 2 1 头部2
  • 解密微信数据库文件解析

    图解说明 xff1a 微信大量数据存储在本地比如 xff1a 联系人 xff08 包含好友地区 电话 通过那种方式添加 xff09 聊天内容 xff08 图片 文字 语音 视频 位置 名片 其他app分享链接 xff09 聊天室 收藏信息
  • qgroundcontrol二次开发环境搭建

    参考考qgroundcontrol官方文档 xff0c 做一些准备工作 xff1a https dev qgroundcontrol com master en getting started index html 1 按官方文档下载qgr
  • Android通过注解来初始化控件

    Android通过注解来初始化控件 对于Android大神的思想与能力我只能膜拜与学习了 xff0c 这里就从大神哪里学来的通过注解来初始化控件简单的概述一下 xff0c 省去了那么繁琐的findViewById步骤 xff08 找到了还要
  • KEIL MDK 工程中头文件包含的路径详解

    xff08 参考工程详见https download csdn net download tianzhijiaoxin 87464281 xff09 文章目录 前言一 include lt h gt 与include 34 h 34 的区别