目录

1.Makefile概念

2.Makefile安装

3.Makefile使用

4.Makefile版本(7个)


1.Makefile概念

Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。

Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。

2.Makefile安装

如果ubuntu没有Makefile,需要安装时,执行下面命令:

sudo apt install make

sudo apt install make-guile

3.Makefile使用

这里以第三个版本为例子做演示:

1.打开Makefile进行编写

gec@ubuntu:~/Desktop/test02$ vi Makefile

2.编译

gec@ubuntu:~/Desktop/test03$ make

3.运行

gec@ubuntu:~/Desktop/test03$ ./main

4.Makefile版本(7个)

(1)版本1:

main:main.c add.c sub.c

gcc main.c add.c sub.c -o main

编译时直接在终端上输入:make

缺点:僵化 死板

(2)版本2:(引入变量)

Makefile变量直接写名字就行了

变量引用:$(变量名)

TARGET=main #TARGET变量

CC=gcc

SRCS=main.c add.c sub.c

$(TARGET):$(SRCS)

$(CC) $(SRCS) -o $(TARGET)

缺点:当添加一个.c文件之后,对应的Makefile需要添加对应的.c文件

(3)版本3:(引入函数)

TARGET=main #TARGET变量

CC=gcc

SRCS=$(wildcard *.c) #查找当前目录所有的.c

$(TARGET):$(SRCS)

$(CC) $(SRCS) -o $(TARGET)

(4)版本4:(添加中间变量.o)

TARGET=main #TARGET变量

CC=gcc

SRCS=$(wildcard *.c) #查找当前目录所有的.c

OBJ=$(patsubst %.c,%.o,$(SRCS)) #函数patsubst将.c替换为.o

$(TARGET):$(OBJ)

$(CC) $(OBJ) -o $(TARGET)

(5)版本5:(添加清除操作)

TARGET=main #TARGET变量

CC=gcc

SRCS=$(wildcard *.c) #查找当前目录所有的.c

OBJ=$(patsubst %.c,%.o,$(SRCS)) #函数patsubst将.c替换为.o

$(TARGET):$(OBJ)

$(CC) $(OBJ) -o $(TARGET)

clean: #用于清除

rm $(OBJ)

清除中间文件在终端上输入:make clean

(6)版本6:(用特殊字符代替目标及依赖)

$@:表示目标 $

TARGET=main #TARGET变量

CC=gcc

SRCS=$(wildcard *.c) #查找当前目录所有的.c

OBJ=$(patsubst %.c,%.o,$(SRCS)) #函数patsubst将.c替换为.o

$(TARGET):$(OBJ)

$(CC) $^ -o $@

%.o:%.c #.c生成.o

$(CC) -c $< -o $@

clean: #用于清除

rm main $(OBJ)

(7)终级版本7:

TARGET=main

CC=gcc

CFLAGS=-I /mnt/hgfs/linuxshare/program/include #指定头文件路径

DIRS=src . #表示.c所在的路径

FILES=$(foreach dir,$(DIRS),$(wildcard $(dir)/*.c)) #循环查看.c文件

OBJ=$(patsubst %.c,%.o,$(FILES))

$(TARGET):$(OBJ)

$(CC) $(OBJ) -o $(TARGET) $(CFLAGS)

clean: #用于清除

rm main $(OBJ)