想象一下,我在以下文件夹中有一个C项目:
C:\microcontroller\stm32\myProject
myProject里面有两个重要的文件夹:
- source
=>这是我的.c
和.h
个文件
- build
=> gcc将在这里写下所有目标文件
注意:正如您所看到的,反斜杠表明这是在Windows PC上发生的。
下图给出了概述:
我不会在这里显示我的完整makefile,因为这会导致我们走得太远。所有.c
=>的makefile中的规则.o
个文件类似。让我们只关注一个特定文件的编译:{{1}}:
fileA2.c
请注意,gcc调用以两个包含标志结束:一个用于folderA,另一个用于folderB。这使得gcc可以使用这些文件夹中的任何头文件(--------------------- 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
,fileA1.h
或fileA2.h
),如果fileB1.h
具有导入语句。
现在让我们考虑fileA2.c
中的源代码。我们假设此文件需要包含fileA2.c
和fileA2.h
。
fileB1.h
这些包含语句完美无缺。 gcc编译器检索给定文件夹中的文件/*******************************/
/* SOURCE CODE fileA2.c */
/*******************************/
// Some include statements
#include "fileA2.h"
#include "fileB1.h"
// Code
...
和fileA2.h
。但我注意到以下内容不起作用:
fileB1.h
最后一个include语句是文件的“部分路径”。我在编译时遇到错误:
/*******************************/
/* SOURCE CODE fileA2.c */
/*******************************/
// Some include statements
#include "fileA2.h"
#include "folderB/fileB1.h"
// Code
...
我如何让gcc来处理这个问题?
PS:使用“部分路径”不是我自己的习惯。但它们在我的芯片的硅供应商的库中出现了很多,所以我必须忍受它。答案 0 :(得分:4)
指定要查找的两个路径包括源文件的当前目录以外的其他路径:
-IC:/microcontroller/stm32/myProject/source/folderA
-IC:/microcontroller/stm32/myProject/source/folderB
你得到的错误是因为没有
C:/microcontroller/stm32/myProject/source/folderA/folderB/fileB1.h
也许
C:/microcontroller/stm32/myProject/source/folderB/folderB/fileB1.h
存在。
要解决此错误,您可以添加以下路径:
-IC:/microcontroller/stm32/myProject/source
答案 1 :(得分:3)
当使用双引号包含头文件时,编译器首先查找与当前文件相同的目录。如果未找到头文件,则继续使用标准包含搜索路径。
因此,当编译器编译文件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
。
答案 2 :(得分:1)
除了在此之前收到的两个正确答案之外,您还有第三次机会在curren目录的#include
指令中指定文件的路径,与< / p>
`#include "../folderB/fileB1.h"