首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU gcc编译器无法处理部分包含语句

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

Stack Overflow用户
提问于 2016-10-25 17:55:40
回答 3查看 173关注 0票数 2

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

C:\microcontroller\stm32\myProject

我在myProject中有两个重要的文件夹:

- source =>这里是我所有的.c.h文件

- build => gcc将在这里写入所有的对象文件。

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

下图概述如下:

我不会在这里显示我的完整makefile,因为这将使我们走得太远。makefile中用于所有.c => .o文件的规则类似。让我们集中精力编译一个特定的文件:fileA2.c

代码语言:javascript
复制
--------------------- 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.hfileA2.hfileB1.h)中的任何一个头文件(如果fileA2.c有导入语句)。

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

代码语言:javascript
复制
/*******************************/
/* SOURCE CODE fileA2.c        */
/*******************************/

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

// Code
...

其中包括的陈述非常有效。gcc编译器检索给定文件夹中的文件fileA2.hfileB1.h。但我注意到以下几点行不通:

代码语言:javascript
复制
/*******************************/
/* 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:使用“部分路径”不是我自己的习惯。但它们在我芯片的硅供应商的库里出现了很多,所以我不得不接受它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-25 18:02:05

为源文件指定两个要查找的路径(当前目录除外):

代码语言:javascript
复制
           -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存在。

要解决错误,可以添加以下路径:

代码语言:javascript
复制
           -IC:/microcontroller/stm32/myProject/source
票数 4
EN

Stack Overflow用户

发布于 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

票数 3
EN

Stack Overflow用户

发布于 2016-10-26 20:28:53

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

代码语言:javascript
复制
`#include "../folderB/fileB1.h"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40246574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档