(P3)Linux开发工具—Makefle上

1.make与Makefile介绍

  • make工具
    利用make工具可以自动完成编译工作。这些工作包括:
    (1)如果仅仅修改了某几个源文件,则只重新编译这几个源文件;
    (2)如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。
    利用这种自动编译可大大简化开发工作,避免不必要的重新编译
  • Makefile
    make工具通过一个称为Makefile的文件来完成并自动维护编译工作。
    Makefile文件描述了整个工程的编译,连接等规则。

2.Makefile基本规则

  • 规则如下
TARGET...:DEPENDENCIES
	COMMAND
	...1)目标TARGET程序产生的文件,如可执行文件和目标文件,中间文件(.s文件);
目标也可以是要执行的动作,如:clean,也称之为伪目标

(2)依赖DEPANDENCIES是用来产生目标的输入文件列表,一个目标通常依赖于多个文件

(3)命令COMMAND是make执行的动作(命令是shell命令或者是可在shell下执行的程序)。
注意:每个命令行的起始字符必须为TAB字符

(4)如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容

目标文件可以有1个或者多个
依赖文件可以有1个或者多个,也可以没有

3.简单的Makefile编写

  • eg1:03make\01
    文件夹包含的内容:
    在这里插入图片描述
只有main.c有代码,代码如下:
int main(void)
{
    return 0;
}
  • Makefile1
.PHONY:clean		##显示指定clean为一个伪目标,怕该目录下有个clean名字的文件,不能编译
main:main.o add.o sub.o
	gcc -Wall -g main.o add.o sub.o -o main
main.o:main.c
	gcc -Wall -g -c main.c -o main.o
add.o:add.c add.h
	gcc -Wall -g -c add.c -o add.o
sub.o:sub.c sub.h
	gcc -Wall -g -c sub.c -o sub.o
clean:
	rm -f main main.o add.o sub.o
  • Makefile2
.PHONY:clean
OBJECTS=main.o add.o sub.o 
main:$(OBJECTS)
	gcc -Wall -g $^ -o $@
main.o:main.c
	gcc -Wall -g -c $< -o $@
add.o:add.c add.h
	gcc -Wall -g -c $< -o $@
sub.o:sub.c sub.h
	gcc -Wall -g -c $< -o $@
clean:
	@echo "begin delete ..."		##该语句(echo "begin delete ...")不想打印出来,就在最前面加一个@符号
	rm -f main $(OBJECTS)
  • 测试Makefile2
    (1)如果不加@
    在这里插入图片描述
    (2)加@
    在这里插入图片描述
make		直接输入make会执行第一个目标
make main.o			make +目标也可以执行,但是只执行该目标的命令
make makefile		Makefile文件名字也可以是makefile
make clean -f Makefile.1		表示用Makefile.1中的规则来执行,指定Makefile文件

4.Make自动化变量

$@ 规则的目标文件名
$< 规则的第一个依赖文件名
$^ 规则的所有依赖文件列表
  • eg:见上述03make\01\Makefile2

5.Makefile编译多个可执行文件

  • 模式规则
%.o:%.c
  • 后缀规则
.c.o:
  • eg:03make\02
    (1)目录如下
    在这里插入图片描述
    (2)文件的内容如下
=========03make\02\01test.c==========
int main(void)
{
    return 0;
}
========================
=================03make\02\02test.c===============
int main(void)
{
    return 0;
}
======================
pub.c和pub.h都为空
  • Makefile1
.PHONY:clean all
BIN=01test 02test		##直接执行:make Makefile
all:$(BIN)				##all也是伪目标,这里并没有给01test,02test是如何生成的,编译器会自动推导,
clean:			    	##会将同名的.c文件生成同名的可执行文件,eg:01test.c生成01test
    rm -f $(BIN)
  • Makefile2
.PHONY:clean all
CC=gcc
CFLAGS=-Wall -g 
BIN=01test 02test		
all:$(BIN)          ##all代表第一个终极目标
%.o:%.c            ##将对应的.c文件生成对应的.o文件,等价于.c.o:
    $(CC) $(CFLAGS) -c $< -o $@
01test:01test.o
    $(CC) $(CFLAGS)  $^ -o $@ ##生成可执行文件不需要-c
02test:02test.o pub.o           ##若02test还依赖pub模块(pub.c,pub.h)
    $(CC) $(CFLAGS) $^ -o $@
clean:			    	
    rm -f $(BIN) *.o
  • 测试:
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章