1、递归make
make命令有递归调用的功能,它可以递归调用子目录中的Makefile。例如在当前目录下有一个Makefile,在当前目录下有一个子目录hello并且其中有一个Makefile。当前目录下有一个文件man.c如下:
void main()
{
hello();
}
当前目录下的Makefile文件内容如下
CC = gcc
CFLAGS = -O2
TARGET = hello
export OBJSDIR = ${pwd}/objs #生成当前目录objs的路径,并能供外部调用
$(TARGET) : $(OBJSDIROBJSDIR)
$(MAKE) -C hello
$(CC) -w -o $(TARGET) $(OBJSDIR)/*.o
main.o:%.o:%.c
$(CC) -w -c $< -o $(OBJSDIR)/$@ $(CFLAGS) -Ihello
$(OBJSDIR):
mkdir $(OBJSDIR)
clean:
- rm -r $(OBJSDIR) #如果rm前面没有-,当执行一次make clean后再次执行make clean会出错
rm -f $(TARGET)
rm -f *~
文件夹hello下有hello.h、hello.c与Makefile
/****************hello.h文件内容**********************/
#include<stdio.h>
/****************hello.c文件内容**********************/
void hello()
{
printf("Hello World!\n");
}
/****************Makefile文件内容**********************/
OBJS = hello.o
all:$(OBJS)
$(OBJS):%.o:%.c
$(CC) -w -c $< -o $(OBJSDIR)/$@ $(CFLAGS)
clean:
rm -f $(OBJS)
rm -f *~
建立好上述的文件夹与文件之后进入执行make,结果如下:
liwei@ubuntu:~/Desktop/study/main$ make
mkdir /home/liwei/Desktop/study/main/objs
gcc -w -c main.c -o /home/liwei/Desktop/study/main/objs/main.o -O2 -Ihello
make -C hello
make[1]: Entering directory '/home/liwei/Desktop/study/main/hello'
cc -w -c hello.c -o /home/liwei/Desktop/study/main/objs/hello.o
make[1]: Leaving directory '/home/liwei/Desktop/study/main/hello'
gcc -w -o hello_world /home/liwei/Desktop/study/main/objs/*.o
liwei@ubuntu:~/Desktop/study/main$