目录
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)