C 文件中的 #include 路径和提供给 GCC 的 -I 指令是否匹配?



我正在寻找 AVR 端口的 FreeRTOS 演示项目。生成文件具有通过"-I"指令指向RTOS源文件所在的目录的路径。但是,在项目的main.c模块中,#include 不提供任何路径,如下所示:

#include "FreeRTOS.h"

所以我无法理解"-I"指令是否只需要链接器才能找到目标文件?这是否也意味着一旦文件被编译为目标代码,对于GCC,如果它知道在哪里查找,它们基本上就躺在同一个文件夹中?

我有这种困惑,因为我以前见过这样的 #include陈述:

#include <avr/io.h>

如果 GCC 已经知道io.h的位置,为什么要在其前面包含"avr">部分?

当我们说

#include <foo/bar.h>

编译器通常在名为foo的目录中查找名为bar.h的文件,该文件位于配置为查找标头的位置之一。例如,标准标头搜索路径通常包含"/usr/include",因此将在"/usr/include/foo"中找到文件"bar.h"(如果存在)。

如果像这样使用-I开关:

-I /usr/include/foo

你也可以写

#include <bar.h>

因为你已将目录foo合并到编译器的标头搜索路径中。

但是,如果foo是某种库或模块,则使用包含子目录foo#include变体可能更具表现力,而不是操作标头搜索路径,这样您就不必这样做。

根据记录,-I开关对链接行为没有直接影响。

顺便说一下,变体

#include "foo/bar.h"

通常表示目录中的文件foo与源文件位于同一目录中。但是,现代编译器似乎也将搜索标头路径应用于这些指令。我不确定这是基于标准的行为,还是只是编译器编写者试图猜测我们的意图。

最新更新