介绍
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
使用
当执行make命令时,编译器会在当前路径下查找makefile文件,并执行文件中的内容。一般会有两种命名方式:一种是:Makefile大写的,二种是makefile,当两者都存在时,编译器会调用小写的makefile文件。因为大写一般是别人发布出来的源码,小写是自己写的,这点一定要清楚。
代码
main.c
#include <stdlib.h>
#include <stdio.h>
#include "tool1.h"
#include "tool2.h"
int main()
{
mytool1();
mytool2();
return 0;
}
tool1.c
#include "tool1.h"
#include <stdlib.h>
#include <stdio.h>
void mytool1()
{
printf("mytool1 \n" );
}
tool2.c
#include "tool2.h"
#include <stdio.h>
#include <stdlib.h>
void mytool2()
{
printf("mytool2 \n");
}
tool1.h
#ifndef TOOL1_H
#define TOOL1_H
void mytool1();
#endif
tool2.h
#ifndef TOOL2_H
#define TOOL2_H
void mytool2();
#endif
举例子:
方式一:
mytool:main.o tool1.o tool2.o
gcc main.o tool1.o tool2.o -o mytool
main.o:main.c
gcc main.c -c -g -Wall -o main.o
tool1.o:tool1.c
gcc tool1.c -c -g -Wall -o tool1.o
tool2.o:tool2.c
gcc tool2.c -c -g -Wall -o tool2.o
clean:
rm *.o mytool -rf
方式二:
OBJS = main.o tool1.o tool2.o
CC =gcc
CXX = g++
CFLAGS += -g -c -Wall
mytool:$(OBJS)
$(CC) $(OBJS) -o mytool
main.o:main.c
$(CC) main.c $(CFLAGS) -o main.o
tool1.o:tool1.c
$(CC) tool1.c $(CFLAGS) -o tool1.o
tool2.o:tool2.c
$(CC) tool2.c $(CFLAGS) -o tool2.o
clean:
$(RM) *.o mytool -r
方式三:
OBJS = main.o tool1.o tool2.o
CC =gcc
CXX = g++
CFLAGS += -g -c -Wall
#target:依赖项
#$^代表上一行的依赖选项 $@ 上一行的target
# RM 代表 rm -f
# CFLAGS 表示编译选项
mytool:$(OBJS) #target:依赖项
$(CC) $^ -o $@
main.o:main.c
$(CC) $^ $(CFLAGS) -o $@
tool1.o:tool1.c
$(CC) $^ $(CFLAGS) -o $@
tool2.o:tool2.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o mytool -r
方法四:
OBJS = main.o tool1.o tool2.o
CC =gcc
CXX = g++
CFLAGS += -g -c -Wall
#target:依赖项
#$^代表上一行的依赖选项 $@ 上一行的target
# RM 代表 rm -f
# CFLAGS 表示编译选项
mytool:$(OBJS) #target:依赖项
$(CC) $^ -o $@
# %相当于通配符 同一句话%是同一个名字
%.o:%.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o mytool -r