我在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
行中给出的文件数量?
由于 亚历
答案 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"