2

我编写了以下 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文件有什么原因吗?

4

1 回答 1

5

从制作手册:

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

因此,下面的规则编译data_test.cpp和不编译test_main.cpp

data_test.o: test/data_test.cpp test/test_main.cpp
    $(CXX2) $< $(CXXFLAG2)
于 2018-04-28T04:37:57.787 回答