1. make的优点
2.makefile基本语法
目标(target):目标文件1 目标文件2
gcc -o 欲新建的可执行文件 目标文件1 目标文件2
3.实例
现在我们有如下三个文件
main.c tool.c tool.h
文件内容如下
main.c
#include "tool.h"
#include <stdio.h>
int main()
{
int arr[5] = {1,8,6,3,4};
int m = find_max(arr,5);
printf("%d\n",m);
return 0;
}
tool.c
#include "tool.h"
int find_max(int arr[],int n)
{
int m = arr[0];
int i;
for(i=0;i<n;i++)
{
if(arr[i]>m)
m = arr[i];
}
return m;
}
tool.h
int find_max(int arr[],int n);
makefile文件按照以下格式写
mian:main.c tool.o
gcc main.c tool.o -o main
tool.o:tool.c
gcc -c tool.c
clean:
rm *.o main
命令行执行make
[ubuntu@VM-48-245-ubuntu ~/makefile_test]$ make
可以看到输出文件如下
main main.c makefile tool.c tool.h tool.o
clean
是用于删除.o
结尾的文件和main文件,执行make clean
make clean
之后文件只剩下
main.c makefile tool.c tool.h
实例2
现在有如下文件
bar.h foo.c foo.o main.c bar.c bar.o foo.h
bar.h代码如下
#include "bar.h"
int find_min(int arr[],int n)
{
int m = arr[0];
int i;
for(i=0;i<n;i++)
{
if(arr[i]<m)
m = arr[i];
}
return m;
}
foo.c代码如下
#include "foo.h"
int find_max(int arr[],int n)
{
int m = arr[0];
int i;
for(i=0;i<n;i++)
{
if(arr[i]>m)
m = arr[i];
}
return m;
}
bar.h和foo.h分别是两个函数的声明,这里不再列出,然后是main.c文件,如下
#include "foo.h"
#include "bar.h"
#include <stdio.h>
int main()
{
int arr[] = {1,8,3,4,5};
int min = find_min(arr,5);
int max = find_max(arr,5);
printf("min = %d\n",min);
printf("max = %d\n",max);
return 0;
}
makefile如下
main:main.c foo.o bar.o
gcc main.c foo.o bar.o -o main
foo.o:foo.c
gcc -c foo.c
bar.o:bar.c
gcc -c bar.c
clean:
rm *.o main
使用shell script变量简化makefile
变量的基本语法:
1.变量最好以“大写字母”为主
2.运用变量时,以 ${变量} 或 $(变量) 使用
此时makefile可以更改为
CC = gcc
main:main.c foo.o bar.o
$(CC) main.c foo.o bar.o -o main
foo.o:foo.c
$(CC) -c foo.c
bar.o:bar.c
$(CC) -c bar.c
clean:
rm *.o main
以后如果我们想用g++编译的话,就可以把第一行gcc改为g++
如果我们想加入链接时也可以使用变量来替换.
实例3
如果我们现在讲上面的main.c拆成两个分别为main_max.c和main_min.c
main_max.c
#include "foo.h"
#include "bar.h"
#include <stdio.h>
int main()
{
int arr[] = {1,8,3,4,5};
int max = find_max(arr,5);
printf("max = %d\n",max);
return 0;
}
更改makefile文件如下
CC = gcc
main_max:main_max.c foo.o bar.o
$(CC) main_max.c foo.o bar.o -o main_max
main_min:main_min.c foo.o bar.o
$(CC) main_min.c foo.o bar.o -o main_min
foo.o:foo.c
$(CC) -c foo.c
bar.o:bar.c
$(CC) -c bar.c
clean:
rm *.o main
执行make后,发现只执行了第一条记录
为了全部执行,将makefile更改如下
CC = gcc
all:main_max main_min
main_max:main_max.c foo.o bar.o
$(CC) main_max.c foo.o bar.o -o main_max
main_min:main_min.c foo.o bar.o
$(CC) main_min.c foo.o bar.o -o main_min
foo.o:foo.c
$(CC) -c foo.c
bar.o:bar.c
$(CC) -c bar.c
clean:
rm *.o main
现在两个都可以编译了
可以看到两个文件都已出现