自动默认包含 + 手动灵活配置

⚙️ 核心机制:自动包含与手动配置

当你创建一个新工程并选择好芯片型号后,Keil 就已经在幕后做了很多工作:

  • 自动包含路径:Keil 会自动将芯片支持包(.pack文件)里的设备头文件路径,以及编译器标准库和 CMSIS 库的路径,添加到项目的包含路径中。你不需要做任何操作,就能直接使用 #include <stm32f10x.h> 这样的语句。

  • 手动添加路径:当你需要包含自己写的或第三方库的头文件时,就需要手动配置。操作路径是:点击“魔术棒” -> Options for Target -> C/C++ 选项卡 -> 在 Include Paths 中添加你的头文件所在文件夹的路径。

🚫 “No Auto Includes”选项:关闭自动包含

在 C/C++ 选项卡中,有一个 “No Auto Includes” 选项。

  • 作用:勾选后,Keil 将不再自动包含安装目录下的标准库和 CMSIS 头文件路径。

  • 后果:你必须手动在 Include Paths 中添加所有需要的路径,包括编译器标准库等,否则编译会报错。

  • 使用场景:当你需要完全控制项目所使用的库版本,避免与Keil自带的库发生冲突时,可以考虑开启此选项。

📂 如何查看和验证包含路径

想确认当前工程到底包含了哪些路径,可以:

  1. 点击“魔术棒”打开 Options for Target

  2. 切换到 C/C++ 选项卡。

  3. 查看 Include Paths 栏。这里会列出所有路径,其中就包括 Keil 自动添加的(如 C:\Keil_v5\ARM\ARMCC\include 和 CMSIS 相关路径)和你手动添加的。

🔍 编译器如何查找头文件:<> 与 "" 的区别

在代码中写 #include 时,使用尖括号(<>)和双引号("")会影响编译器的查找顺序。

  • 使用双引号 #include "header.h"

    1. 优先当前源文件所在的目录中查找。

    2. 若未找到,再去 Include Paths 中用户指定的目录查找。

    3. 最后去 Keil 的系统目录(如编译器标准库路径)查找。

    适用场景:常用于包含用户自己编写的、与源文件在同一目录下的头文件。

  • 使用尖括号 #include <header.h>

    1. 优先在 Keil 的系统目录(编译器标准库、CMSIS 等)中查找。

    2. 再去 Include Paths 中用户指定的目录查找。

    3. 最后去当前源文件所在的目录查找。

    适用场景:常用于包含Keil 自带的标准库CMSIS 核心头文件。

最直观的体现:Build Output 窗口的编译命令

点击 Build(编译)后,在下方的 Build Output 窗口,你会看到编译器实际执行的完整命令行。自动添加的路径会以 -I(Include 参数)的形式跟在编译器指令后面。

例如,编译 main.c 时,你会看到类似这样的输出(以 ARM Compiler V6 为例):

text

"armclang.exe" -c -g -O0 -std=c11 -target-arm-none-eabi 
-I./RTE/_Target_1 
-I"C:\Keil_v5\ARM\PACK\Keil\STM32F4xx_DFP\2.17.1\Drivers\CMSIS\Device\ST\STM32F4xx\Include"   <-- 自动添加的设备头文件路径
-I"C:\Keil_v5\ARM\CMSIS\Core\Include"                                                         <-- 自动添加的CMSIS核心路径
-I"C:\Keil_v5\ARM\ARMCLANG\include"                                                          <-- 自动添加的编译器标准库路径
-I"User/Inc"                                                                                  <-- 你手动添加的路径
...
"main.c"
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐