2016-10-25 31 views
2

想象一下,我在下面的文件夾中的C-項目:GNU gcc編譯器無法處理部分包括報表

C:\microcontroller\stm32\myProject

我有內部myProject的兩個重要的文件夾:
- source =這裏>都是我的.c.h文件
- build => GCC將寫的所有目標文件在這裏

注:如你所看到的,反斜線我ndicate這是發生在Windows PC上。

下圖給出了一個概述:

enter image description here

我不會顯示我在這裏完整的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 

注意,海合會呼籲有兩個標誌包括結尾:一個用於folderA,一個用於FolderB中。如果fileA2.c有一個導入語句,這使得gcc可以使用這些文件夾中的任何頭文件(fileA1.h,fileA2.hfileB1.h)。

現在讓我們考慮一下fileA2.c的源代碼。我們假設這個文件需要包含fileA2.hfileB1.h

​​

這些包括陳述完美。 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:使用「局部路徑」並不是我自己的習慣。但是他們在我的芯片供應商的庫中出現很多,所以我必須忍受它。

+0

爲'fileA2.c'是'folderA'並沒有'folderB'裏面'folderA',這不是找到包含文件的原因。試試'#include「../folderB/fileB1.h」,它會正常找到它。這意味着去到父目錄,然後到'folderB',最後在那裏包含'fileB1.h'文件。 –

回答

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 
+0

謝謝,這幫了我很多:-) –

3

當使用雙引號包含頭文件時,編譯器首先在與當前文件相同的目錄中查找。如果沒有找到頭文件,則繼續使用標準的包含搜索路徑。

因此,當編譯器編譯文件source/folderA/fileA2.c時,編譯器查找的第一個目錄include文件是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

+0

非常感謝! –

+0

你的回答也是正確的。不幸的是,我不能用綠色複選標記標記兩個答案。但請放心,我已經讚賞你的回答同樣好;-) –

1

除了你在此之前已經收到兩個正確的響應,你有第三次機會來指定文件的路徑在#include從CURREN目錄指令,與

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