makefile中的-I标志不会导致找到头文件(gtest / gtest.h)

时间:2016-11-15 00:52:31

标签: c++ makefile

以前我一直在努力在根目录中创建一个makefile来处理src文件夹中的源文件和include文件夹中的头文件。在此之后,我想添加另一个文件夹tests,我将保留带有测试的.cpp文件。不幸的是我遇到了这个问题。

文件夹结构为:

.
|__makefile
|
|__/src
|  |
|  |__[regular .cpp files]
|
|__/include
|  |
|  |__[.h files]
|  |
|  |__/gtest
|     |
|     |__gtest.h
|
|__/tests
   |
   |__test_factorial.cpp

./测试/ test_factorial.cpp:

#include "gtest/gtest.h"
#include "factorial.h"

// some tests

生成文件:

CC = g++

CFLAGS = -Wall

INCLUDES = -I./include

LIBS = -lgtest -lpthread

SOURCEDIR = ./src/
SRCS = $(shell find ./src/ -name '*.cpp')
SRCS += $(shell find ./tests/ -name '*.cpp')

.PHONY: clean depend

SRCS := $(filter-out ./tests/main_tests.cpp, $(SRCS))
OBJS = $(SRCS:.cpp=.o)
OBJS := $(OBJS:./src%=.%)

release: $(OBJS)
        $(CC) $(CFLAGS) -o app $(OBJS) $(LIBS)

VPATH = ./src:./tests

%.o: ./src/%.cpp
        $(CC) $(CFLAGS) $(INCLUDES) -c ./src/$*.cpp

%.o: ./tests/%.cpp
        $(CC) $(CFLAGS) $(INCLUDES) -c ./tests/$*.cpp

depend: .depend

.depend: $(SRCS)
        rm -f ./.depend
        $(CC) $(CFLAGS) $(INCLUDES) -MM $^ > ./.depend;

include .depend

当我从根目录执行make时,/ src中的所有文件编译得很好(我最终在根目录中有对象文件)但是我从/ tests目录得到了.cpp文件的错误:

g++    -c -o tests/test_factorial.o tests/test_factorial.cpp
tests/test_factorial.cpp:1:25: fatal error: gtest/gtest.h: No such file or directory
compilation terminated.
<builtin>: recipe for target 'tests/test_factorial.o' failed
make: *** [tests/test_factorial.o] Error 1

什么可能很重要,.depend文件似乎没有问题:

test_factorial.o: tests/test_factorial.cpp include/gtest/gtest.h \
 include/factorial.h

makefile有什么问题?

修改

我相信这段错误:

<builtin>: recipe for target 'tests/test_factorial.o' failed

表明makefile的这一部分出了问题:

%.o: ./src/%.cpp
        $(CC) $(CFLAGS) $(INCLUDES) -c ./src/$*.cpp

%.o: ./tests/%.cpp
        $(CC) $(CFLAGS) $(INCLUDES) -c ./tests/$*.cpp

为什么要尝试./tests/test_factorial.o而不是./test_factorial.o?让我再次强调./src/*.cpp文件的目标文件最终在根目录中,即./*.o,而不是./src/*.o

1 个答案:

答案 0 :(得分:0)

您的makefile正在构建

tests/test_factorial.o

tests/test_factorial.cpp

且与规则不匹配

%.o: ./tests/%.cpp

所以它改为使用内置规则。 (另外,惯例是使用$(CXX)$(CXXFLAGS)而不是$(CC)来构建c ++文件。

尝试

的规则模式
./tests/%.o: ./tests/%.cpp

Makefile使用名称tests/test_factorial.o的原因是

OBJS = $(SRCS:.cpp=.o)

(显而易见)使.o文件的路径与.cpp的路径相同。

您有后续规则剥离路径src/

OBJS := $(OBJS:./src%=.%)

并且tests/

没有类似的规则