以前我一直在努力在根目录中创建一个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
。
答案 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/