makefile的规则
target ... : prerequisites ...
command
...
...
target
可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。
prerequisites
生成该target所依赖的文件和/或target
command
该target要执行的命令(任意的shell命令)
windows下的一个示例
makefile
#链接
run.exe : main.o function.o
g++ -o run main.o function.o
#编译
main.o : main.cpp
g++ -c main.cpp
function.o : function.cpp
g++ -c function.cpp
#清理
clean :
del run.exe main.o
然后在该目录下直接输入命令 make 就可以生成执行文件run.exe。如果要删除执行文件和所有的中间目标文件,那么,只要简单地执行一下 make clean 就可以了。
main.cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int add(int, int);
int main() {
int a = 3, b = 4;
cout << add(a, b);
return 0;
}
function.cpp
#include <iostream>
int add (int a, int b) {
return a + b;
}
make如何工作
make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
1.如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“run.exe”这个文件,并把这个文件作为最终的目标文件。
2.如果run.exe文件不存在,或是run.exe所依赖的后面的 .o 文件的文件修改时间要比 run.exe 这个文件新,那么,他就会执行后面所定义的命令来生成 run.exe 这个文件。
3.如果 run.exe 所依赖的 .o 文件也不存在,那么make会在当前文件中找目标为 .o 文件的依赖性,如果找到则再根据那一个规则生成 .o 文件。(这有点像一个堆栈的过程)
4.当然,你的Cpp文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生成make的终极任务,也就是执行文件 run.exe 了。
tips
1.cpp文件用g++编译而不是gcc编译,因为gcc不含C++标准库
2.clean在linux下用rm进行删除,但windows下没有rm命令,所以用del