三个文件,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;
- }
下面是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
上面的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
所以,可以知道,这个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选项。