0

我在 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(并将它们放入target/bin)。现在,在运行这个 Makefile 时,每个库似乎都被编译了,但我得到了这个错误:

multiple definition of `main'

不奇怪,当我尝试编译一些都有main()功能的测试脚本时。知道如何解决这个问题,以及如何改进上述 Makefile 吗?也许有一些关于如何减少o_base行中给出的文件数量的想法?

谢谢亚历克斯

4

1 回答 1

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"
于 2012-09-19T05:56:35.780 回答