Make程序示例:
假设一个项目的程序由5个文件组成,源码如下:
/main.c/
#include “mytool1.h”
#include “mytool2.h”
int main()
{
mytool1_print(“hello mytool1!\n”);
mytool2_print(“hello mytool2!\n”);
return 0;
}
/mytool1.c/
#include “mytool1.h”
#include <stdio.h>
void mytool1_print(char *print_str)
{
printf(“This is mytool1 print :%s”,print_str);
}
/mytool1.h/
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/mytool2.c/
#include “mytool2.h”
#include <stdio.h>
void mytool2_print(char *print_str)
{
printf(“This is mytool2 print :%s”,print_str);
}
/mytool2.h/
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
之后,创建原始Makefile文件:
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -f *.o main
之后,命令行输入:make,执行结果如下,并生成可执行文件 main.
root@vmuser-virtual-machine:/test# make
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
命令行输入:./main,结果如下:
root@vmuser-virtual-machine:/test# ./main
This is mytool1 print :hello mytool1!
This is mytool2 print :hello mytool2!
改进一:使用用户自定义变量
make:$(OBJ)
gcc -o main $(OBJ)
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -f *.o main
改进二:使用自动推导:
cc=gcc
OBJ=main.o mytool1.o mytool2.o
make:$(OBJ)
$(cc) -o main $(OBJ)
main.o:mytool1.h mytool2.h
mytool1.o:mytool1.h
mytool2.o:mytool2.h
.PHONY: clean
clean:
rm -f main $(OBJ)
让Make工程管理器自动推导,我们只需要有一个.o文件,它会自动地把对应的.c文件加到依赖文件中,而且gcc -c *.c也会被推导出来。
改进三:自动变量($@, , ^, ,<)的应用
cc=gcc
OBJ=main.o mytool1.o mytool2.o
make:$(OBJ)
$(cc) -o $@ $^
main.o:main.c mytool1.h mytool2.h
$(cc) -c $<
mytool1.o:mytool1.c mytool1.h
$(cc) -c $<
mytool2.o:mytool2.c mytool2.h
$(cc) -c $<
.PHONY: clean
clean:
rm -f main $(OBJ)
其中:
$@ 为目标文件;
$^ 为所有的依赖文件;
$< 为第一个依赖文件。