我正在尝试从子目录编译某些文件以进行单元测试。我想编译 ./under_test/test_code.cpp 并将目标文件放入 ./obj 文件夹中。
现在我可以编译工作目录中的文件并将其放入 obj 中并以这种方式构建和链接。我不知道如何从编译的子目录中获取文件。请提供任何帮助。
TARGET_EXEC ?= unit_test
IDIR =./include
CC = g++ --std=c++14
CFLAGS = -g $(INC) -I$(IDIR)
BUILD_DIR = obj
SRC_DIRS ?= .
INC = -Iunder_test
LIBS = -lgtest -lgmock
# DEPS = $(wildcard $(IDIR)/*.h)
# SRCS := $(shell find . -name '*.cpp')
SRCS = $(wildcard *.cpp)
TEST_SRCS = under_test/test_code.cpp
# _OBJ = main.o state.o
OBJ = $(SRCS:%.cpp=$(BUILD_DIR)/%.o)
all: $(TARGET_EXEC)
$(TARGET_EXEC): $(OBJ)
@echo linking $^
$(CC) $(OBJ) -o $@ $(CFLAGS) $(LIBS)
$(BUILD_DIR)/%.o: %.cpp $(TEST_SRCS)
@echo compiling $^
$(CC) $(CFLAGS) -c $^ -o $@
.PHONY: clean
.PHONY: show
SOURCES := $(shell basename -a under_test/test_code.cpp \
under_test/more_test_code.cpp)
show:
echo $(SOURCES)
clean:
rm -f $(BUILD_DIR)/*.o *~ core $(INCDIR)/*~
rm $(TARGET_EXEC)
这就是我所拥有的,但我正在得到
在_test/test_code.cpp下编译main.cpp
g++ --std=c++14 -g -I./include -c main.cpp under_test/test_code.cpp -o obj/main.o
g++:致命错误:无法为多个文件指定“-o”和“-c”、“-S”或“-E”
这在某些方面是错误的:
$(BUILD_DIR)/%.o: %.cpp $(TEST_SRCS)
@echo compiling $^
$(CC) $(CFLAGS) -c $^ -o $@
$^
自动变量扩展到所有先决条件。 但在 make 中,每个配方都应该解释如何构建一个目标,而不是多个目标。 因此,这个秘籍应该用于编译一个源文件,而不是所有源文件。 这就是您看到编译器错误的原因,因为您正在使用多个源文件调用编译器的一个实例。 您想使用 $<
来扩展为第一个食谱。
这导致了第二个问题:您不想在此处列出所有源文件作为先决条件,因为这意味着每当您更改一个源文件时,您都会说必须重建所有目标文件。
您想要的只是:
$(BUILD_DIR)/%.o: %.cpp
@echo compiling $<
$(CC) $(CFLAGS) -c $< -o $@
您并没有真正说出您想对测试对象文件做什么。 如果您希望它们链接到
TARGET_EXEC
,您只需将源添加到 SRCS
。
如果您希望它们被编译但不链接到任何地方,您可以将目标文件添加到
all:
TEST_SRCS = under_test/test_code.cpp
TEST_OBJS = $(TEST_SRCS:%.cpp=$(BUILD_DIR)/%.o)
all: $(TARGET_EXEC) $(TEST_OBJS)