【问题标题】:GNU gcc compiler cannot handle partial include statementsGNU gcc 编译器无法处理部分包含语句
【发布时间】:2016-10-25 17:55:40
【问题描述】:

假设我在以下文件夹中有一个 C 项目:

C:\microcontroller\stm32\myProject

我的项目中有两个重要的文件夹:
- source => 这是我所有的.c.h 文件
- build => gcc 会将所有目标文件写入这里

注意:如您所见,反斜杠表示这是在 Windows 电脑上发生的。

下图给出了一个概览:

我不会在这里展示我完整的 makefile,因为那样会让我们走得太远。所有.c => .o 文件的makefile 中的规则都是相似的。让我们只关注一个特定文件的编译: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 调用以两个包含标志结束:一个用于文件夹 A,一个用于文件夹 B。如果fileA2.c 有import 语句,这使得gcc 可以使用这些文件夹(fileA1.hfileA2.hfileB1.h)中的任何头文件。

现在让我们考虑fileA2.c 中的源代码。我们假设这个文件需要包含fileA2.hfileB1.h

/*******************************/
/* SOURCE CODE fileA2.c        */
/*******************************/

// Some include statements
#include "fileA2.h"
#include "fileB1.h"

// Code
...

这些包含语句完美运行。 gcc 编译器检索给定文件夹中的文件fileA2.hfileB1.h。但我注意到以下内容不起作用:

/*******************************/
/* SOURCE CODE fileA2.c        */
/*******************************/

// Some include statements
#include "fileA2.h"
#include "folderB/fileB1.h"

// Code
...

最后一个包含语句是文件的“部分路径”。编译时出现错误:
fatal error: folderB/fileB1.h: No such file or directory

我怎样才能让 gcc 来处理这个问题?

PS:使用“部分路径”不是我自己的习惯。但是它们在我芯片的芯片供应商的库中出现了很多,所以我不得不忍受它。

【问题讨论】:

  • 因为fileA2.cfolderA 中,而folderBfolderA 中,这就是找不到包含文件的原因。试试#include "../folderB/fileB1.h" and it will find it normally. This means go to parent directory, then to folderB, and finally include the file fileB1.h`。

标签: c gcc makefile gnu-make


【解决方案1】:

您指定两个路径来查找源文件的当前目录以外的包含:

           -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

【讨论】:

  • 谢谢,这对我帮助很大:-)
【解决方案2】:

当使用双引号包含头文件时,编译器首先在与当前文件相同的目录中查找。如果找不到头文件,则继续使用标准包含搜索路径。

因此,当编译器编译文件source/folderA/fileA2.c 时,编译器将查找包含文件的第一个目录是source/folderA 目录。在第一个示例中,不会在此处找到 fileB1.h,但由于您将 source/folderB 添加到标准搜索路径中,因此将在那里找到 source/folderB/fileB2.h

在第二个示例中,source/folderA 上没有 folderB/fileB1.h 文件,因此编译器将搜索标准搜索路径。当涉及到source/folderB 时,它会再次尝试folderB/fileB2.h(即source/folderB/folderB/fileB2.h),但仍然找不到,也不会在其他任何地方找到。

您需要添加-IC:/microcontroller/stm32/myProject/source 才能找到folderB/fileB1.h

【讨论】:

  • 非常感谢!
  • 你的回答也是正确的。不幸的是,我不能用绿色复选标记标记两个答案。但请放心,我同样非常感谢您的回答 ;-)
【解决方案3】:

除了您在此之前收到的两个正确响应之外,您还有第三次机会在#include 指令中指定文件的路径从当前目录,与

`#include "../folderB/fileB1.h"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2019-07-10
    • 2011-09-20
    • 2013-01-29
    相关资源
    最近更新 更多