我正在学习如何使用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答案 0 :(得分:4)
由于您将module.o
和main.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 ++
$ @是目标的自动变量(冒号前的值)
@ ^是先决条件的自动变量(冒号后的值)