假设我在以下文件夹中有一个C项目:
C:\microcontroller\stm32\myProject
我在myProject中有两个重要的文件夹:
- source =>这里是我所有的.c和.h文件
- build => gcc将在这里写入所有的对象文件。
注意:如您所见,反斜杠表示这发生在Windows上。
下图概述如下:

我不会在这里显示我的完整makefile,因为这将使我们走得太远。makefile中用于所有.c => .o文件的规则类似。让我们集中精力编译一个特定的文件:fileA2.c
--------------------- COMPILATION OF FILE fileA2.c -------------------
Building ./build/folderA/fileA2.o
arm-none-eabi-gcc C:\\microcontroller\\stm32\\myProject\\source\\folderA\\fileA2.c
-o C:\\microcontroller\\stm32\\myProject\\build\\folderA\\fileA2.o
-c
-MMD
-mcpu=cortex-m7
-...
-IC:/microcontroller/stm32/myProject/source/folderA
-IC:/microcontroller/stm32/myProject/source/folderB请注意,gcc调用以两个包含标志结束:一个用于folderA,另一个用于folderB。这使gcc能够使用这些文件夹(fileA1.h、fileA2.h或fileB1.h)中的任何一个头文件(如果fileA2.c有导入语句)。
现在让我们考虑一下fileA2.c中的源代码。我们假设这个文件需要包括fileA2.h和fileB1.h。
/*******************************/
/* SOURCE CODE fileA2.c */
/*******************************/
// Some include statements
#include "fileA2.h"
#include "fileB1.h"
// Code
...其中包括的陈述非常有效。gcc编译器检索给定文件夹中的文件fileA2.h和fileB1.h。但我注意到以下几点行不通:
/*******************************/
/* SOURCE CODE fileA2.c */
/*******************************/
// Some include statements
#include "fileA2.h"
#include "folderB/fileB1.h"
// Code
...最后一个include语句是指向文件的“部分路径”。在编译时,我会得到错误:
fatal error: folderB/fileB1.h: No such file or directory
我怎样才能让gcc来处理这件事?
PS:使用“部分路径”不是我自己的习惯。但它们在我芯片的硅供应商的库里出现了很多,所以我不得不接受它。
发布于 2016-10-25 18:02:05
为源文件指定两个要查找的路径(当前目录除外):
-IC:/microcontroller/stm32/myProject/source/folderA
-IC:/microcontroller/stm32/myProject/source/folderB你会发现错误,因为两者
C:/microcontroller/stm32/myProject/source/folderA/folderB/fileB1.h nor
C:/microcontroller/stm32/myProject/source/folderB/folderB/fileB1.h存在。
要解决错误,可以添加以下路径:
-IC:/microcontroller/stm32/myProject/source发布于 2016-10-25 18:01:29
当使用双引号包含头文件时,编译器首先在当前文件所在的目录中查找。如果找不到头文件,则继续使用标准的包含搜索路径。
因此,当编译器编译文件source/folderA/fileA2.c时,编译器将查找的第一个目录是source/folderA目录。在第一个示例中,不会在那里找到fileB1.h,但是由于您将source/folderB添加到标准搜索路径中,所以它将以source/folderB/fileB2.h的形式在那里找到。
在第二个示例中,在folderB/fileB1.h上没有source/folderA文件,因此编译器将搜索标准搜索路径。当涉及到source/folderB时,它将再次尝试folderB/fileB2.h (即source/folderB/folderB/fileB2.h),它仍然不会被找到,也不会在其他地方找到。
您需要添加-IC:/microcontroller/stm32/myProject/source才能找到folderB/fileB1.h。
发布于 2016-10-26 20:28:53
除了之前收到的两个正确的响应之外,您还有第三次机会从curren目录在#include指令中指定文件的路径,如下所示
`#include "../folderB/fileB1.h"https://stackoverflow.com/questions/40246574
复制相似问题