专栏名称: 嵌入式微处理器
关注这个时代最火的嵌入式微处理器,你想知道的都在这里。
目录
相关文章推荐
武汉本地宝  ·  2025荆州马拉松延期举办! ·  昨天  
武汉本地宝  ·  雨雨雨!武汉未来几天阴雨天“包场”! ·  3 天前  
武汉本地宝  ·  下调!湖北当前油价是多少? ·  4 天前  
InfoQ架构头条  ·  DeepSeek 爆火真相:不靠“人盯”, ... ·  5 天前  
51好读  ›  专栏  ›  嵌入式微处理器

C语言头文件路径相关问题总结说明

嵌入式微处理器  · 公众号  ·  · 2024-10-28 12:00

正文

本文目录:

  • 前言
  • 一、C语言中的头文件引用

  • 二、KEIL 中的头文件路径

    • 2.1 IncudePaths 指定的路径

    • 2.2  include < > 搜索的系统路径
  • 三、Linux 中的头文件路径

  • 结语

前言:

前段时间在写 Linux 专栏的过程中,忽然想到一个问题:C语言的头文件路径,因为在GCC环境下面,可以很直观的了解到程序对头文件的查找位置,但对于使用集成开发环境 KEIL 或者 IAR 的朋友们来说,一些系统的库文件路径根本就不知道在什么地方。

所以,我们今天就来聊一下 C 语言的头文件路径相关的问题 ,包括系统路径位置,绝对路径与相对路径,正斜杠 / 与 反斜杠 \ 使用说明等。

一、C语言中的头文件引用

我们都知道,在我们 C 编程的时候,我们头文件的引用使用的是 #include <> 或者 #include "" ,比如:

而且大家应该都知道:
  • include 使用双引号" ",编译器首先在当前目录下查找头文件,如果没有找到,再到系统目录下查找;
  • include 使用尖括号< >,编译器会到系统目录下查找头文件。

这里额外提一句,因为 使用双引号" "如果在当前目录找不到头文件,最终还是会去系统路径下寻找,所以头文件包含,完全可以都使用双引号" " ,至于实际中还是有很多使用 < > 和 " " 混搭,那是因为在确定是引用系统路径的头文件的时候,使用 < > 相对来说效率高那么一点点,省去了在当前目录下面寻找的那一点时间。

对于使用双引号" " 的当前目录下查找,大家应该都知道,就是与引用头文件的 .c 文件相同的目录下,比如上面是 main.c 文件引用的,就是首先在与 main.c 相同的目录中去查找。

那么对于 < > 从系统路径中搜索,这个系统目录到底在哪里呢?

二、KEIL 中的头文件路径

我们先从熟悉的 IDE 入手,用 KEIL 来说明一下。

2.1 IncudePaths 指定的路径

在我们使用 KEIL 做项目的时候,都需要一个 IncudePaths ,就是填写头文件路径,如下图所示:

KEIL4 上是51单片机的项目:

KEIL5 上是 STM32 的项目:

为了工程结构框架,我们不可能把文件放在同一个目录下面,所以需要进行额外的指定头文件路径,这里只要用过 KEIL 的朋友应该都能明白。

对于 include 使用双引号" "的头文件,首先会在引用头文件的 .c 文件相同的目录下去查找,如果查找不到,会在上面 IncudePaths 设置中所有设置过的目录中去查找,这一点我们不多赘述。

绝对路径和相对路径:

这里我们额外说明一个问题,绝对路径与相对路径。

在上面的示例图中,我们可以看到, IncudePaths 里面所添加的路径,都是 ../ 开头的,这种表示方式就是相对路径。

使用相对路径的好处是即便整个工程移动了位置,也无需修改什么设置,因为工程文件的相对位置没有改变。

简单复习下相对路径的表示:

./ : 表示当前路径 ../ :表示上一级目录

绝对路径就比较简单了,绝对路径就是直接从根部(盘符)开始表示的路径,在 Windows 中,就是 C盘,D盘,这些,在 Linux 中,没有盘符的说法,根部就是 / ,比如下面两个都是绝对路径的表示:

C:\Keil\C51 /home/qzh/linux

正斜杠 / 与 反斜杠 \ 与双斜杠:

正好提到文件路径,顺带把斜杠的问题也说一下,在上面示意图中,我们可以看到,既有正斜杠,又有反斜杠:

对于路径的表示 ( 声明,这里只是针对文件路径!路径! )
  • Linux 中都使用正斜杠 / . Linux下好理解,只能用正斜杠 / : /home/qzh/linux .
  • 在Windows 中,稍微复杂一点 . 在Windows 中常用 反斜杠 \ ,比如我们随便看一个系统显示的路径都是反斜杠 \

实际上,Windows 除了在一些特定的场合必须用反斜杠 \ ,在引用路径的时候斜杠 / 和反斜杠 \ 可以互用的。

比如下面两种方式的引用都是可以的:

#include "..\led\led.h" 

#include "../led/led.h"  
为了可移植性,引入头文件时建议使用正斜杠 / #include "../led/led.h"

不仅如此,在Windows下引用文件路径的时候,正反双斜杠 // \\ 与斜杠 / 、反斜杠 \ 可以互用的,如下图所示:

双斜杠

在写一些脚本或者程序的时候( 上面是引用路径的情况,这里额外提一下程序中的情况,程序中!程序中! ),我们也经常看到双斜杠,比如:

C:\\Keil\\C51

这种路径表示是为什么呢?

因为在大多编译器中, \ 是一个转义字符,例如 \n,\r ,所以如果使用反斜杠 \ ,会使得路径出问题,所以会写成 \\

当然正如我们上面说过的,我们在程序中可以写成 C:\\Keil\\C51 ,当然也可以使用 斜杠 / 写成 C:/Keil/C51

2.2  include < > 搜索的系统路径

额外提了那么多,回到我们的正题,来说说在 KEIL 中的 #include < > 的查找路径。

比如我们在本文第一张示意图上有一个应用 #include ,我们明确的告诉编译器这个需要从系统路径中去查找,这个 KEIL 所谓的系统路径在什么地方呢?

这里我们也没什么好分析的,直接告诉大家答案:

第一个基于51平台的,使用的 51 的编译器, #include < > 的查找路径为 “KEIL的安装目录”:\Keil\C51\INC ,比如博主的KEIL安装在C盘,这个路径就是 C:\Keil\C51\INC

当然,我们可以简单的做个试验确认一下,我们可以在 KEIL 中先打开 这个头文件:

然后,我们打开 C:\Keil\C51\INC 目录下的 MATH.h 文件,进行简单的修改,看一下是否是同一个文件,如下图所示:

那么对于 KEIL5 中的 STM32 中如果使用 #include < > ,这个的查找路径又是怎样的呢?

STM32 在 KEIL中使用的编译器为 ARMCC,这个系统路径的位置为: “KEIL的安装目录”:\Keil_v5\ARM\ARMCC\include ,比如博主的KEIL安装在C盘,这个路径就是 C:\Keil_v5\ARM\ARMCC\include

这一点我就不去确定了,大家可以自己添加一个库函数头文件,然后自己根据上文的方式测试一下便知。

三、Linux 中的头文件路径

上面介绍了 Windows 下的 KEIL 环境中的头文件系统路径,那么我们来看看 Linux 中的路径又是在哪里,我们知道在 Linux 中 C 语言的编译器是 GCC 编译器,在文章开头的前言我就写过了, 使用 GCC 编译器可以很直观的查看到 #include < > 尖括号包含的头文件的查找路径,下面我们来看一下。

写一个简单的程序,里面用到了 这个头文件,我们可以使用编译选项 -v 来打印出详细的编译步骤:
如上图所示,在 Linux 是不是很直观,没什么需要特别说明的。






请到「今天看啥」查看全文