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



我在Linux系统上编译一个中型项目时遇到了Makefile问题。我的想法是让Makefile尽可能简单,让Makefile完成所有的工作。我有几个源代码(在source/src中),但也有几个测试文件来测试每个库(在source/test中)。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自动编译并链接目录source/test中的EACH文件(并将它们放入target/bin)。现在,在运行这个Makefile时,每个库似乎都被编译了,但我得到了这个错误:

multiple definition of `main'

不奇怪,因为我试图编译一些测试脚本,它们都有main()函数。你知道如何解决这个问题,以及如何改进上面的Makefile吗?也许还有一些关于如何减少o_base行中给出的文件数量的想法?

谢谢Alex

您的分析是正确的,您尝试在测试目标中将所有.o文件链接到一个文件中,这些文件应该会导致不同的可执行文件。

如果您希望TEstrongOURCE中的每个文件都是一个结果可执行文件,则必须为每个单独的文件调用编译器。实现这一点的一种方法是在规则中编写一个(bash)循环,对TEstrongOURCE的所有元素进行迭代,并为每个元素调用编译器。

"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"

最新更新