我正在寻找 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
与源文件位于同一目录中。但是,现代编译器似乎也将搜索标头路径应用于这些指令。我不确定这是基于标准的行为,还是只是编译器编写者试图猜测我们的意图。