为什么我们需要使用Catch单独编译主测试文件?

rb6*_*612 2 c++ linker makefile catch-unit-test

我编写了以下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)
Run Code Online (Sandbox Code Playgroud)

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

#define CATCH_CONFIG_MAIN
#include "catch.hpp"
Run Code Online (Sandbox Code Playgroud)

我试着看看我的Makefile中是否可以替换测试规则,如下所示:

data_test.o: test/data_test.cpp test/test_main.cpp
    $(CXX2) $< $(CXXFLAG2)
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个"_main", referenced from: implicit entry/start for main executable错误.对我来说,它似乎应该工作正常,包括test_main.cpp作为我的实际测试的依赖.是否有理由将此主文件编译为自己的.o文件?

S.M*_*.M. 5

从制作手册:

$ <
第一个先决条件的名称.如果目标从隐式规则获得其配方,则这将是隐式规则添加的第一个先决条件(请参阅隐式规则).

因此,下面的规则编译data_test.cpp并且不编译test_main.cpp:

data_test.o: test/data_test.cpp test/test_main.cpp
    $(CXX2) $< $(CXXFLAG2)
Run Code Online (Sandbox Code Playgroud)