对于Make工程管理器的一些认识

Make是GCCT提供的半自动化工程管理器,用于编写编译规则的Makefile文件,能提高多源文件项目的编译效率。在调试过程中,Make通过检查文件时间戳避免不必要的编译,提升效率。Makefile包含目标文件、依赖文件和编译规则。文章还介绍了Makefile的编写结构以及目录分类的组织方式。

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

一:什么是工程管理器Make?

Make是GCC提供的一种半自动化的工程管理器。所谓的半自动化是指在使用工程管理器之前需要人工编写程序的编译规则,所有的编译规则都保存在Makefile文件中,全自动化得工程管理器会在编译程序前自动生成Makefile文件。


二:为什么要有工程管理器Make?

因为在实际的开发过程中,仅仅通过gcc命令对程序进行编译时非常低效的,原因主要有两点:

1,程序往往是由多个源文件组成的,源文件的个数越多,那么gcc的命令行就会越长。此外,各种编译规则也会加大gcc命令行的复杂度,所以在开发调试的过程中,通过输入gcc命令行来编译程序是很麻烦的。

2,在程序的整个开发过程中,调试的工作量占到了整体工作量的70%以上。在调试程序的过程中,每次调试一般只会修改部分源文件。而在使用gcc命令行编译程序时,gcc会把那些没有被修改的源文件一起编译,这样就会影响变异的总体效率。

因此为了提高编译程序的效率,工程管理器Make就应运而生!


三:工程管理器Make有哪些优越性?

1,使用方便。通过命令“MAKE”就可以启动MAKE工程管理器对程序进行编译,所以不再需要每次都输入GCC命令行。MAKE启动后会根据Makefile文件中的编译规则命令自动对源文件进行编译和链接,最终生成可执行文件。

2, 调试效率高。为了提高编译程序的效率,Make会检查每个源文件的修改时间(时间戳)。只有在上次编译之后被修改的源文件才会在接下来的编译过程中被编译和链接,这样就能避免多余的编译工作量。为了保证源文件具有正确的时间戳,必须保证操作系统时间的准确性。


四:什么是Makefile?

Makefile存储着工程管理器Make进行工作所需的编译规则命令。

Makefile文件由以下三种基本内容组成:

(1)需要生成的目标文件(target file)

(2)生成目标文件所需要的依赖文件(dependency file)

(3)生成目标文件的编译规则命令行(command)


五:一个简单的makefile文件         

test:main.o add.o sub.o mul.o div.o
        gcc main.o add.o sub.o mul.o div.o -o test    
main.o:main.c
        gcc -c main.c
sub.o:sub.c
        gcc -c sub.c
add.o:add.c
        gcc -c add.c
mul.o:mul.c
        gcc -c mul.c                                         
div.o:div.c
        gcc -c div.c
.PHONY:clean
clean:
        rm -f *.o test

注意事项;(1)  .PHONY:clean伪目标     test目标    main.o 依赖    gcc main.o add.o sub.o mul.o div.o -o test  命令

           (2)执行顺序:当依赖是目标体的时候,跳转过去,执行完,再跳转过来

           (3)Makefile 与  makefile  在同一目录下,优先识别  makefile  


六:另一种makefile 写法

1,目录分类:(1)功能目录,有几个创建几个,之下建立src,src之中放.c文件, 在每个功能目录下都建一个makefile

(2)include目录放声明文件

(3)scripts 放脚本文件  在它之下也要放makefile 

(4)bin 放可执行文件

(5)lib 放库文件

(6)doc 放文档信息   readme  使用说明

(7)顶层目录下放一个总控makefile文件


2,例子;

总控makefile文件

include scripts/Makefile

modules_make = $(MAKE) -C $(1);
modules_clean = $(MAKE) clean -C $(1);

.PHONY: all mm mc clean

all: $(Target)

mm:
    @ $(foreach n,$(Modules),$(call modules_make,$(n)))
mc:
    @ $(foreach n,$(Modules),$(call modules_clean,$(n)))

$(Target) : mm
    $(CC) $(CFLAGS) -o $(Target) $(AllObjs) $(Libs)
    @ echo $(Target) make done!

clean : mc
    rm -rf $(Target)
    @ echo clean done!                                             **使用时,主控makefile复制到自己的工程目录下,根据自己的工程目                                                         录修改scripts下的makefile文件中的 Modules += check_putin pack_message main这一行中的变量名。并复制到相应位置,子目录下的makefile也通过复制完成。



scripts下的makefile文件                     
CC := gcc
CFLAGS := -Wall -O3
Libs = -lpthread
Target := client
Source := $(wildcard src/*.c)
Objs := $(patsubst %.c,%.o,$(Source))
Modules += check_putin pack_message main
AllObjs := $(addsuffix /src/*.o,$(Modules))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值