工程管理文件Makefile

文章介绍了Makefile的作用,它是用于管理工程文件的工具,简化编译过程。Makefile包含规则定义,如目标和依赖关系,当依赖文件改变时自动触发重新编译。文章还讲解了Makefile的书写规则,多个目标的处理,预设和自定义变量的使用,自动化变量如$^和$@的含义,以及伪指令和函数如wildcard的功能,帮助读者理解并掌握Makefile的编写和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Makefile

        1、什么叫做Makefile ??

        Makefile 文件 称之为工程管理文件, 用来管理 一个工程 中所有的文件,包括 源文件 头文件 库文件.....

        2、目的

        主要是为了简化编译的复杂度

二、项目工程 由 哪些文件组成??

        1、简单

                多个源文件

        2、复杂

 三、Makefile 文件的规则

1、规则的核心: “依赖” “目标"

        依赖: 指的是 源文件 .c文件 main.c func1.c func2.c

        目标: 指的是 可执行程序文件 main

2、makefile 书写规则

        1)确定目标叫什么名字

        2)按照以下规则书写 makefile

目标文件:依赖文件(如果有多个依赖,每个依赖文件之间使用空格分开) <Tab按键>执行规则

main:main.c func1.c func2.c gcc $^ -o $@ -I ./ 

重复执行make ,会出现第二次执行的时候提示:

 gec@ubuntu:/mnt/hgfs/GZ22229/05/1-code/06project1-makefile$ make make: “bin/project”已是最新。 gec@ubuntu:/mnt/hgfs/GZ22229/0

 

makefile 编译规则:

        在makefile编译之前,都会检测所有的依赖对应的修改时间是否与上次编译的修改时间一致,如果所有的依赖都没有修改过,则不会进行编译,如果有一个依赖的时间被修改过,则makefile就会再次编译。

四、makefile 多个目标情况

target1:

                XXXXX

target2:

                XXXXX

target3:

                XXXXX

执行make --》默认执行的是第一个目标

执行 make target2 -->指定执行 target2

./bin/project:./c_source/project.c gcc $^ -o $@ -I ./include -L ./lib -ladmin -luser clean: rm ./bin/project

 五、makfile变量种类

1、自定义变量

        所有的变量 都是 字符串类型

A = "hello" B = "world" 其实也可以不用加 ""

 引用变量

 B = $(A) world

 简单版的makefilef

 TARGET = project

C_SOURCE = main.c  func1.c func2.c

$(TARGET):$(C_SOURCE)

        gcc $^ -o $@ -I ./

clean:

         rm $(TARGET)

复杂版的makefilef

TARGET = ./bin/project

C_SOURCE = ./c_source/*.c

 INCLUDE_PATH += -I ./include

LIBRARY_PATH += -L ./lib

LIB += -ladmin

LIB += -luser

$(TARGET):$(C_SOURCE)

         gcc $^ -o $@ $(INCLUDE_PATH) $(LIBRARY_PATH) $(LIB)

clean:

        rm $(TARGET) 

2、系统预设定变量

有的变量已经在系统中定义好了,并且已经赋值,我们直接引用即可。

CC -->编译器名字,默认等于cc cc等价于gcc 也就是说 CC = gcc

RM -->删除命令 ,默认等于 rm -f 也就是说 RM = rm -f

这些变量如果不赋值,就按默认的值来处理,但是这些变量也是可以赋值的,如果赋值了,就按新的值来处理。

 CC = gcc

TARGET = ./bin/project

C_SOURCE = ./c_source/*.c

INCLUDE_PATH += -I ./include

LIBRARY_PATH += -L ./lib

LIB += -ladmin LIB += -luser

$(TARGET):$(C_SOURCE)

         $(CC) $^ -o $@ $(INCLUDE_PATH) $(LIBRARY_PATH) $(LIB)

clean:

        $(RM) $(TARGET)

3、自动化变量 --》变量的值不是固定的,而是变化的。

        $^ -->代表所有的依赖

        $@ -->代表所有的目标

 

六、makefile伪指令

场景一:假设makefile中有一套规则:

clean:

        $(RM) bin/main

当我们执行make clean时,makefile就会执行这套规则。

场景二:假设makefile中有一套规则,并且当前目录下有一个目录名字叫clean/

clean:

        $(RM) bin/main

当我们执行make clean时:

make: 'clean' is up to date.

如何告诉编译器,这个make clean是一套规则,而不是一个生成文件?

解决方案:使用伪指令。

怎么添加?-> 只需要在makefile中添加一句话就可以。

.PHONY:clean

 

七、makefile函数

1、wildcard -->在指定的路径下寻找匹配的文件

        C语言函数调用 函数名(参数1,参数2,参数3)

        makefile函数调用 $(函数名 参数1,参数2,参数3)

比如:我想把当前目录下的所有.c文件名都找出来,并且将这些文件名保存在一个变量C_SOURCE中

        C_SOURCE = $(wildcard ./c_source/*.c)

TARGET = ./bin/project

C_SOURCE = $(wildcard ./c_source/*.c)

INCLUDE_PATH += -I ./include

LIBRARY_PATH += -L ./lib

LIB += -ladmin

LIB += -luser

$(TARGET):$(C_SOURCE)

        $(CC) $^ -o $@ $(INCLUDE_PATH) $(LIBRARY_PATH) $(LIB)

clean:

        $(RM) $(TARGET)

.PHONY:clean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值