Makefile找不到.hpp

时间:2017-03-17 17:46:12

标签: c++ gcc makefile

我的项目中有2个目录,一个名为Builds,有Makefile和一个测试程序(test-P0-consola.cpp),还有一个名为P0的目录,它构成我使用的类,cadena(string)和fecha(约会)。

test-P0-consola.cpp包括它们,但是Make没有找到它们。

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

VPATH = ../P0:.:..

test-consola: test-P0-consola.o fecha.o cadena.o
    ${CPP} ${CPPFLAGS} -o $@.ex $^

test-P0-consola.o: test-P0-consola.cpp fecha.hpp cadena.hpp
    ${CPP} -c ${CPPFLAGS} $< -o $@

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

它抛出致命错误&#34; cadena.hpp不存在文件或目录&#34;当它试图编译test-P0-consola.o时,但当我强制它编译cadena或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

2 个答案:

答案 0 :(得分: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 $@.ex $^
                          ~~~~~
不要欺骗Make。运行配方的结果应该是目标文件,PHONY目标除外。这里的食谱应该是-o $@。如果您需要.ex后缀,则应将目标更改为test-consola.ex。如果您仍希望将规则命名为test-consola,则您需要:

test-consola : test-consola.ex
test-consola : .PHONY

答案 1 :(得分:1)

您应该在makefile中输入您需要编译器使用的.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 $@.ex $^

test-P0-consola.o: test-P0-consola.cpp fecha.hpp cadena.hpp
    ${CPP} -c ${CPPFLAGS} ${INC} $< -o $@

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