GNU gcc编译器无法处理部分包含语句

时间:2016-10-25 17:55:41

标签: c gcc makefile gnu-make

想象一下,我在以下文件夹中有一个C项目:

C:\microcontroller\stm32\myProject

myProject里面有两个重要的文件夹:
- source =>这是我的.c.h个文件 - build => gcc将在这里写下所有目标文件

注意:正如您所看到的,反斜杠表明这是在Windows PC上发生的。

下图给出了概述:

enter image description here

我不会在这里显示我的完整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.hfileA2.h),如果fileB1.h具有导入语句。

现在让我们考虑fileA2.c中的源代码。我们假设此文件需要包含fileA2.cfileA2.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:使用“部分路径”不是我自己的习惯。但它们在我的芯片的硅供应商的库中出现了很多,所以我必须忍受它。

3 个答案:

答案 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"