初识Makefile

来源:互联网 发布:不出门知天下事的生肖 编辑:程序博客网 时间:2024/06/06 00:20

三个文件,hello.h  hello.cpp  main.cpp

hello.h

[cpp] view plaincopy
  1. #ifndef MAKE_FILE_OO1  
  2. #define MAKE_FILE_001  
  3.   
  4. void printHello();  
  5.   
  6. #endif  

hello.cpp

[cpp] view plaincopy
  1. #include <iostream>  
  2. #include "hello.h"  
  3. using namespace std;  
  4.   
  5. void printHello()  
  6. {  
  7.     cout<<"Hello Makefile!"<<endl;  
  8. }  

main.cpp

[cpp] view plaincopy
  1. #include "hello.h"  
  2.   
  3. int main()  
  4. {  
  5.     printHello();  
  6.     return 0;  
  7. }  
程序很简单,就是输出Hello Makefile!

下面是Makefile:

[cpp] view plaincopy
  1. main:main.o hello.o  
  2.     g++ -o main main.o hello.o  
  3. main.o:main.cpp hello.h  
  4.     g++ -c -o main.o main.cpp  
  5. hello.o:hello.cpp hello.h  
  6.     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行是一条。

以规则

[plain] view plaincopy
  1. main:main.o hello.o  
  2.     g++ -o main main.o hello.o  
为例进行说明。

main是目标文件,冒号后面的main.o hello.o是依赖的文件

g++ -o main main.o hello.o说明如何用依赖文件生成目标文件。注意:每一行的编译命令必须以TAB键开头


同理:

[plain] view plaincopy
  1. main.o:main.cpp hello.h  
  2.     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选项。


0 0
原创粉丝点击