makefile发出多个定义

时间:2018-03-07 08:49:32

标签: c++ makefile

我正在学习如何使用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之后,我得到了很多"多个定义的"和"未定义的引用"

帮助将受到高度赞赏

代码块中的p.s代码完美无缺,这就是为什么我这么困惑。我正在使用mingw32-make

2 个答案:

答案 0 :(得分:4)

由于您将module.omain.o链接在一起但您的main.cpp已包含module.cpp,因此您会收到“多个定义错误”。不要在module.cpp中包含main.cpp(即:删除#include "module.cpp内的main.cpp指令。由于main.o不依赖于module.cpp,因此您也应该从main.o规则中删除该先决条件。

另外,考虑使用GNU Make的automatic variables代替硬编码文件名和预定义变量(即:CXX)而不是硬编码命令(即:{{ 1}}):

g++

甚至更好,依靠预定义的模式规则从output: main.o module.o $(CXX) $^ -o $@ main.o: main.cpp module.h $(CXX) -c $< module.o: module.cpp module.h $(CXX) -c $< 文件生成.o个文件:

.cpp

请注意,未提供最后两行将导致output: main.o module.o $(CXX) $^ -o $@ main.o: module.h module.o: module.h main.o 仍然是最新的(即:未重建)即使{ {1}}更改。

答案 1 :(得分: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 ++

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

@ ^是先决条件的自动变量(冒号后的值)