Makefile问题:多重定义。

3

我正在学习如何使用makefile,但是经过几个小时的研究,我仍然卡住了,我无法解决我的makefile有什么问题:

output: main.o module.o
    g++ main.o module.o  -o output
main.o: module.cpp module.h
    g++ -c module.cpp
module.o: module.cpp module.h
    g++ -c main.cpp

我的main.cpp文件中有#include "module.cpp"

我的module.cpp文件中有#include "module.h"

在尝试执行makefile后,我得到了很多"multiple definitions of"和"undefined references"的错误信息。

非常感谢您的帮助。

p.s.在CodeBlocks中的代码运行得非常顺利,所以我非常困惑。我正在使用mingw32-make。


2
这不是Makefile的问题,只是不包含*.cpp文件,然后再试一遍/说出错误信息。 - bartop
2个回答

4
您正在遇到“多重定义错误”,因为您将module.omain.o链接在一起,但是您的main.cpp已经包含了module.cpp。请勿在main.cpp中包含module.cpp(即:删除main.cpp内部的#include "module.cpp"指令)。由于main.o不再依赖于module.cpp,因此您还应该从main.o规则中删除该先决条件。

另外,请考虑使用GNU Make的自动变量代替硬编码的文件名,并使用预定义变量(例如:CXX)代替硬编码命令(例如:g++):

output: main.o module.o
    $(CXX) $^  -o $@

main.o: main.cpp module.h
    $(CXX) -c $<

module.o: module.cpp module.h
    $(CXX) -c $<

或者更好的方法是,依赖于预定义的模式规则,从.cpp文件生成.o文件:

output: main.o module.o
    $(CXX) $^  -o $@

main.o: module.h
module.o: module.h

请注意,如果没有提供最后两行,即使module.h发生更改,main.omodule.o仍然会保持最新状态(即不会被重新构建)。

2
感谢Makefile中的隐式规则,这应该已经足够了:
output: main.o module.o
    g++ main.o module.o  -o output

隐式规则允许make知道如何从.cpp文件创建.o文件。 但这可以更简单:
output: main.o module.o
    $(CXX) -o $@ @^

$(CXX)是你的C++编译器,通常是g++。

$@是目标文件的自动变量(冒号前的值)。

@^是必备条件的自动变量(冒号后的值)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接