三个文件,hello.h hello.cpp main.cpp
hello.h
#ifndef MAKE_FILE_OO1
#define MAKE_FILE_001
void printHello();
#endif
hello.cpp
#include <iostream>
#include "hello.h"
using namespace std;
void printHello()
{
cout<<"Hello Makefile!"<<endl;
}
main.cpp
#include "hello.h"
int main()
{
printHello();
return 0;
}
程序很简单,就是输出Hello Makefile!
下面是Makefile:
main:main.o hello.o
g++ -o main main.o hello.o
main.o:main.cpp hello.h
g++ -c -o main.o main.cpp
hello.o:hello.cpp hello.h
g++ -c -o hello.o hello.cpp
终端执行make,make会自动在本目录内寻找一个名字为Makefile或makefile的文件,并执行。执行后会发现目录内多了三个文件,分别是hello.o main.o main,main就是可执行程序,终端输入./main即可执行。
上面的Makefile中定义了3条规则,第1行和第2行是一条,第3和4行是一条,第5行和第6行是一条。
以规则
main:main.o hello.o
g++ -o main main.o hello.o
为例进行说明。
main是目标文件,冒号后面的main.o hello.o是依赖的文件
g++ -o main main.o hello.o说明如何用依赖文件生成目标文件。注意:每一行的编译命令必须以TAB键开头
同理:
main.o:main.cpp hello.h
g++ -c -o main.o main.cpp
main.o是目标文件,main.cpp hello.h是依赖的文件
所以,可以知道,这个Makefile一共定义了三个目标文件main,main.o,hello.o。
第一个目标为最终目标,也就是最终要生成的文件。生成其余的目标(main.o hello.o)都是为了生成最终目标(main)服务。
另外,可以看到生成main.o和hello.o时,编译选项中有个-c,它的意思是只编译不链接。举例来说,在编译main.o时,用到了函数printHello,但是这个函数在hello.o(hello.cpp)中导出,如果不适用-c选项,那么main.cpp编译为main.o后将会寻找函数printHello()的实体进行链接,但是我们并没有制定hello.o,所以将会出错。一般在编译单个obj模块的时候,都要加上-c选项。