您的位置:首页 > 其它

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

2016-04-20 10:34 375 查看
一:什么是工程管理器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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: