使用make编译子目录中的选定文件并放入obj文件夹中

问题描述 投票:0回答:1

我正在尝试从子目录编译某些文件以进行单元测试。我想编译 ./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”

c++ makefile g++
1个回答
0
投票

这在某些方面是错误的:

$(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)
© www.soinside.com 2019 - 2024. All rights reserved.