现在的位置: 首页 > 综合 > 正文

初识Makefile

2013年11月11日 ⁄ 综合 ⁄ 共 1148字 ⁄ 字号 评论关闭

三个文件,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选项。

抱歉!评论已关闭.