2017-03-17 67 views
0

我有2個目錄,在我的項目,一個叫做構建,誰擁有誰constains類的Makefile文件和測試程序(測試-P0-consola.cpp)和另一種稱爲P0一個目錄我使用,cadena(字符串)和fecha(日期)。Makefile中沒有找到.HPP

測試-P0-consola.cpp包括他們兩個,但並不意味着必須找到他們。

CPP = g++ 
CPPFLAGS = -std=c++14 -g -Wall -pedantic 

VPATH = ../P0:.:.. 

test-consola: test-P0-consola.o fecha.o cadena.o 
    ${CPP} ${CPPFLAGS} -o [email protected] $^ 

test-P0-consola.o: test-P0-consola.cpp fecha.hpp cadena.hpp 
    ${CPP} -c ${CPPFLAGS} $< -o [email protected] 

fecha.o: fecha.hpp 
cadena.o: cadena.hpp 

它拋出致命錯誤當它試圖編譯測試-P0-consola.o「cadena.hpp不存在的文件或目錄」,但發現他們時,我強迫它編譯卡德納或fecha。我正在使用GCC和Ubuntu。

.. 
├── Builds 
│   ├── makefile.mak 
│   └── test-P0-consola.cpp 
├── P0 
│   ├── cadena.cpp 
│   ├── cadena.hpp 
│   ├── fecha.cpp 
│   └── fecha.hpp 

編輯

錯誤:在您的錯誤

g++ -std=c++14 -g -Wall -pedantic -c test-P0-consola.cpp 
test-P0-consola.cpp:7:21: fatal error: fecha.hpp: There is no file or directory 

compilation terminated. 

makefile.mak:9: Failure in the instructions for the objective 'test-P0-consola.o' 

make: *** [test-P0-consola.o] Error 1 
+1

你能描述的特定錯誤和特定的構建,你在做什麼,並打印完整的目錄樹,構建的開始?目前還不清楚錯誤是什麼。 – Barry

+0

我添加了完整的錯誤以及目錄樹。我只是試圖執行一個測試,檢查類是否有一些錯誤。如果您在同一個文件夾中編譯它們,它工作正常。 – jramirez

回答

1

你應該把在生成文件包括你需要的編譯器使用.HPP文件的路徑。您應該使用-Ipath編譯器指令,其中path是包含文件的路徑。

見`Makefile: How to correctly include header file and its directory?

How to define several include path in Makefile

喜歡的東西:

CPP = g++ 
CPPFLAGS = -std=c++14 -g -Wall -pedantic 
INC = -Iyourincludebasepath/P0 

VPATH = ../P0:.:.. 

test-consola: test-P0-consola.o fecha.o cadena.o 
    ${CPP} ${CPPFLAGS} ${INC} -o [email protected] $^ 

test-P0-consola.o: test-P0-consola.cpp fecha.hpp cadena.hpp 
    ${CPP} -c ${CPPFLAGS} ${INC} $< -o [email protected] 

fecha.o: fecha.hpp 
cadena.o: cadena.hpp 
+0

我以爲你不用加我 - 我非常感謝你 – jramirez

2

仔細查看:

test-P0-consola.cpp:7:21: fatal error: fecha.hpp: There is no file or directory 

你可能有這樣的事情:

// test-P0-consola.cpp 
#include "fetcha.hpp" 

fetcha.hpp不在該目錄中,因此無法找到它。您可能需要直接更改包含文件的方式(通過#include "../P0/fetcha.hpp")或更改構建規則以通過其他包含路徑(通過-I../P0)。


注:我不知道有一個理由來增加.VPATH。這是含蓄的。

注2:這是一個壞主意:

test-consola: test-P0-consola.o fecha.o cadena.o 
    ${CPP} ${CPPFLAGS} -o [email protected] $^ 
          ~~~~~ 

不要句謊話來彌補。運行配方的結果應該是目標文件,但PHONY目標除外。這裏的配方應該是-o [email protected]。如果您需要.ex後綴,則應將目標更改爲test-consola.ex。如果您仍然希望該規則被命名爲test-consola,你會想:

test-consola : test-consola.ex 
test-consola : .PHONY 
+0

問題是我沒有添加 - 我注意到你的筆記!謝謝 – jramirez