c++ - 为什么我们需要用Catch单独编译一个主测试文件?

标签 c++ makefile linker 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)

在我的 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”,引用自: 主可执行文件的隐式条目/启动错误。对我来说,似乎只要包含 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)

关于c++ - 为什么我们需要用Catch单独编译一个主测试文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50072794/

相关文章:

c++ - 在多线程应用程序中安全卸载 DLL/共享对象

c++ - 队列的排序 vector

compilation - genbarcode 0.4-make : *** [.dep] Error 123

makefile - 何时/如何指定配置/制作目标

c++ - GCC - 具有相同名称的不同类的错误

c++ - 简单的数学解析器 Flex&Bison

C++ 运算符 << 重载

windows - Eclipse、cmake、Windows、MingW - 什么 Makefile 生成器?

qt - undefined reference 错误 FFMPEG + QT + Ubuntu 12.04.2 LTS

c - 链接 libxml2 时出错