为什么要用Catch单独编译一个主测试文件?

Why do we need to compile a main test file separately with Catch?

我编写了以下 Makefile(它按预期工作):

CXX2 = clang++
CXXFLAG2 = -std=c++11 -c -g -O0 -Wall -Wextra
LD2 = clang++
LDFLAG2 = -std=c++11

testing: data_test.o test_main.o dataframe.o csvreader.o course.o
    $(LD2) $^ $(LDFLAG2) -o $@

data_test.o: test/data_test.cpp
    $(CXX2) $< $(CXXFLAG2)

test_main.o: test/test_main.cpp
    $(CXX2) $< $(CXXFLAG2)

dataframe.o: src/DataFrame.cpp src/CSVReader.cpp src/Course.cpp
    $(CXX2) $< $(CXXFLAG2)

在我的 test_main.cpp 文件中,我只有以下几行:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

我试着看看我的 Makefile 中是否可以按如下方式替换测试规则:

data_test.o: test/data_test.cpp test/test_main.cpp
    $(CXX2) $< $(CXXFLAG2)

但是,我收到 "_main", referenced from: implicit entry/start for main executable 错误。对我来说,它似乎应该可以正常工作,只需将 test_main.cpp 作为我实际测试的依赖项。这个主文件需要编译成它自己的 .o 文件是有原因的吗?

来自制作手册:

$<
The name of the first prerequisite. If the target got its recipe from an implicit rule, this will be the first prerequisite added by the implicit rule (see Implicit Rules).

因此下面的规则编译 data_test.cpp 而不会编译 test_main.cpp:

data_test.o: test/data_test.cpp test/test_main.cpp
    $(CXX2) $< $(CXXFLAG2)