我正在尝试创建一个Makefile,但我真的很挣扎。我有3个文件; main.cpp,garage.cpp和garage.hpp。以下命令有效,但我无法弄清楚如何将其转换为makefile。任何帮助将不胜感激。 -std = c ++ 0x很重要,因为如果我删除它并用其他东西替换它就不会编译。再次感谢。
工作
g++ -std=c++0x -Wall -o main main.cpp garage.hpp garage.cpp
答案 0 :(得分:8)
仅供参考,将头文件(garage.hpp
)添加到编译/链接行是不对的。只应将源文件(.cpp
)放在编译行上。
@ gowrath的解决方案很容易理解,但它与命令行解决方案完全相同:它没有利用任何make的功能。除了使用makefile之外,编写shell脚本或别名要比使用makefile更容易。
@ Rahul的解决方案解决了所有问题,但没有利用make的任何功能,这些功能允许您在编写makefile时减少输入或工作量。
Make实际上有大量的内置规则。为了自定义它们,您只需设置标准变量的值,make将完成剩下的工作。你可以写这个makefile:
CXX = g++
CXXFLAGS = -std=c++0x -Wall
OBJECTS = main.o garage.o
main: $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $^
$(OBJECTS): garage.hpp
链接规则使用automatic variables来避免重新键入目标(main
)或先决条件(main.o
,garage.o
)。
最后一行确保如果garage.hpp
文件发生更改,make知道必须重新编译源文件。您不必编写规则来告诉make 如何编译源文件:它已经知道如何操作。
答案 1 :(得分:1)
Makefile是编译代码的非常有效的方法。 Makefile使用时间戳来检测文件中的任何更改,并仅编译那些已更改的文件。这节省了大量时间。
makefile下面会完美地完成你的工作。
output: main.o garage.o
g++ -std=c++0x -Wall main.o garage.o -o output
main.o: main.cpp
g++ -c main.cpp
garage.o: garage.cpp garage.hpp
g++ -c garage.cpp
clean:
rm *.o output
g++
和rm
命令前的空格为 tab
将此文件命名为Makefile
编译类型make
。这将创建一个名为output
使用./output
答案 2 :(得分:0)
最简单的方法是在Makefile中使用它(确保第二行之前的空格是单个标签):
all:
g++ -std=c++0x -Wall -o main main.cpp garage.hpp garage.cpp
这当然不是最好的方法,但如果你只是想编译它,这就是你的解决方案。阅读有关make文件的教程以获得更详细的理解。