Makefile的使用
一、概念
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
二、Makefile基本格式
target ... : prerequisites ...
command
...
...
其中:
target - 目标文件, 可以是 Object File, 也可以是可执行文件
prerequisites - 生成 target 所需要的文件或者目标
command - make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头
三、Makefile的简单使用步骤
需要的文件如下:
1、编写c文件
max.c
int max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
min.c
int min(int x,int y)
{
if(x>y)
return y;
else
return x;
}
main.c
#include<stdio.h>
#include "max.h"
#include "min.h"
int main()
{
int m,n;
m = max(3,6);
n = min(3,6);
printf("max = %d\n,min = %d\n",m,n);
return 0;
}
2、编写h文件
max.h
#ifndef __MAX_H //如果宏未被定义,则编译下面的代码
#define __MAX_H //定义宏
int max(int x,int y);
#endif //结束一个#if…#else条件编译块
min.h
#ifndef __MIN_H
#define __MIN_H
int min(int x,int y);
#endif
3、编写Makefile
main:max.o min.o main.c #main是要生成的可执行文件 后面是依赖文件
gcc min.o max.o main.c -o main #编译命令
max.o:max.c max.h #max.o是要生成的目标文件 后面是依赖文件
gcc -c max.c #编译命令
min.o:min.c min.h #min.o是要生成的目标文件 后面是依赖文件
gcc -c min.c #编译命令
clean: #执行make clean的时候要执行的命令
rm -rf main *.o #删除main(可执行文件)和所有的.o文件
4、make
5、清除make clean
四、Makefile高级用法
1.利用变量控制
$$ 打开makefile中定义的shell变量
$打开makefile中定义的变量
@命令将不被make回显出来
TARGET = main
CC = gcc
CFLAGS = -g
OBJS = max.o min.o main.c
$(TARGET):$(OBJS)
$(CC) $(OBJS) -o $(TARGET)
max.o:max.c max.h
$(CC) -c max.c
min.o:min.c min.h
$(CC) -c min.c
clean:
rm -rf $(TARGET) *.o
2.使用自动化变量
自动变量 | 含义 |
---|---|
$@ | 表示规则中的目标文件集合 |
$% | 表示规则中的目标成员名 |
$< | 第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标 |
$? | 比目标新的依赖目标的集合 |
$^ | 所有依赖目标的集合, 会去除重复的依赖目标 |
#交叉编译工具链
#CC=arm-linux-gnueabihf-gcc
CC=gcc
#math(-lm)链接库
CFLAGS=-lm -lpthread
#获取全部的c文件
SrcFiles=$(wildcard *.c)
#使用替换函数获取.o文件(将所有.c文件转化为.o文件)
OBJS= $(patsubst %.c,%.o,$(SrcFiles))
all:main
main:$(OBJS)
$(CC) -o $@ $^ $(CFLAGS)
%.o:%.c
$(CC) -c $< $(CFLAGS)
#定义伪目标,防止有歧义
.PHONY:clean all
clean:
rm -rf $(OBJS)
rm -rf main