如何使用Linux中的Makefile一次编译一堆测试C ++文件

时间:2012-09-19 05:27:23

标签: c++ linux makefile

我在Linux系统上编译中型项目时遇到Makefile问题。我的想法是让Makefile尽可能简单,让Makefile完成所有工作。我有几个源代码(在source / src中),但也有几个测试文件来测试每个库(在源/测试中)。 Makefile在这里:

DHOME         = ${HOME}/Project
DSRC          = ${DHOME}/source/src
DINCLUDE      = ${DHOME}/source/include
BIN           = ${DHOME}/target/bin
DirObj        = ${DHOME}/target/obj
DirLib        = ${DHOME}/target/lib

INCLUDES      = -I${DINCLUDE} 
DLIB          = ${DHOME}/target/lib
LIBS          = -L${DLIB} -lm ${DLIB}/dclass.a

CXX           = g++ -g ${INCLUDES} -L${DLIB}
MAKE          = ${CXX} -O -Wall -fPIC -c

TESTS =  test_FCity test_FPlane
o_base  =  DPara.o  DString.o  FCommand.o  FInput.o

${o_base}: %.o: $(DSRC)/%.cc
      $(MAKE) $(CFLAGS) $< -o ${DirObj}/$@ 

dclass: $(o_base)
      ar -rs ${DirLib}/dclass.a ${DirObj}/*.o

TEST_SOURCE = $(wildcard test/test_*.cc)


test: ${o_base} dclass
      ${CXX} ${TEST_SOURCE} -o ${BIN}/$@ ${LIBS}

main: $(SOURCES) $(EXECUTABLE)
      ${CXX} /src/main.c -o ${BIN}/main ${LIBS}

我想用make main做的是编译和链接主代码(main.cc)[在上面的Makefile中未经测试]和make test自动编译和链接EACH目录source/test中的文件(并将它们放入target/bin)。现在,在运行这个Makefile时,每个库似乎都被编译了,但是我收到了这个错误:

multiple definition of `main'

我不知道,因为我尝试编译一些都具有main()功能的测试脚本。知道如何解决这个问题,以及如何改进上面的Makefile?也许想一下如何减少o_base行中给出的文件数量?

由于   亚历

1 个答案:

答案 0 :(得分:0)

您的分析是正确的,您尝试将测试目标中的所有.o文件链接到一个文件中。

如果你想为TEST_SOURCE中的每个文件生成一个可执行的可执行文件,你必须为每个单独的文件调用编译器。实现此目的的一种方法是在规则中写入一个(bash)循环,迭代TEST_SOURCE的所有元素,并为每个元素调用编译器。

“makefile”-ier方法是定义依赖关系,即你定义测试还取决于TEST_SOURCE的目标(即你定义可执行文件,例如TEST_EXEC = $(TEST_SOURCE:.o = _exec))并使用编译器调用作为TEST_EXEC生成的规则。

编辑:更详细:

你需要测试的可执行文件的名称:(我现在没有使用结尾_exec,但只使用了基本名称)(注意 - 这假设每个.cc都是一个测试,但是有已经是一个TESTS变量,我认为可能不是这样的):

TEST_EXEC = $(TEST_SOURCE:.cc=)

现在我们必须说明如何构建其中一个测试可执行文件:

${TEST_EXEC}: % : %.cc dclass ${o_base}
        ${CXX} $< -o $@               # fit this line to your needs

最后我们告诉他我们的目标测试取决于所有那些测试可执行文件:

test: ${TEST_EXEC}
        echo we have nothing to do here, so we just emit "Tests created"