Makefile教程
实例一
我们刚开始学习使用Linux编译c代码,一般都是使用gcc进行编译,如下:
test.c
#include <stdio.h>
int main(){
printf("Hello World\n");
return 0;
}
gcc test.c -o test
但是当我们项目变得非常复杂的时候,我们使用这种方法就会变得非常的复杂,这个时候Makefile就派上用场了。
新建一个Makefile
touch Makefile
Makefile的格式:
target : dependencies
command
# 目标文件 : 目标文件会依赖于哪些文件
# (tab) 命令
Makefile:
test : test.c
gcc test.c -o test
实例二
tool.c
#include "tool.h"
int find_max(int arr[],int n){
int i;
int m = arr[0];
for(i = 0;i < n;i++){
if(arr[i] > m) m = arr[i];
}
return m;
}
tool.h
#ifndef _TOOL_H
#define _TOOL_H
int find_max(int arr[],int n);
#endif
mian.c
#include <stdio.h>
#include "tool.h"
int main(){
int arr[5] = {1,5,10,2,3};
int m = find_max(arr,5);
printf("%d\n",m);
return 0;
}
直接编译:
gcc tool.c main.c -o main
但是这样效率低,并且如果类似的tool.c
很多的话,不好编写
Makefile
:
main : main.c tool.o
gcc main.c tool.o -o main
tool.o : tool.c
gcc -c tool.c # 直接编译成 .o 文件
可以发现生成了.o的中间文件,我们可以对Makefile文件进行操作,使得删除中间文件
main : main.c tool.o
gcc main.c tool.o -o main
tool.o : tool.c
gcc -c tool.c # 直接生成.o文件
clean :
rm tool.o
实例三
bar.c
#include "bar.h"
int find_min(int arr[],int n){
int i;
int m = arr[0];
for(i = 0;i < n;i++){
if(arr[i] < m) m = arr[i];
}
return m;
}
bar.h
#ifndef _BAR_H
#define _BAR_H
int find_min(int arr[],int n);
#endif
foo.c
#include "foo.h"
int find_max(int arr[],int n){
int i;
int m = arr[0];
for(i = 0;i < n;i++){
if(arr[i] > m) m = arr[i];
}
return m;
}
foo.h
#ifndef _FOO_H
#define _FOOL_H
int find_max(int arr[],int n);
#endif
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 foo.o bar.o
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zqyGfR43-1633941535418)(https://i.loli.net/2021/10/11/Zt8kFXTjxubsGWd.png)]
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 foo.o bar.o
]