Почему нам нужно скомпилировать основной тестовый файл отдельно с помощью Catch? - PullRequest
0 голосов
/ 28 апреля 2018

Я написал следующий 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 файл?

1 Ответ

0 голосов
/ 28 апреля 2018

Из руководства по изготовлению:

$ <</strong>
Название первой предпосылки. Если цель получила свой рецепт из неявного правила, это будет первым предварительным условием, добавленным неявным правилом (см. Неявные правила).

Таким образом, правило ниже компилирует data_test.cpp и не компилирует test_main.cpp:

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