大佬教程收集整理的这篇文章主要介绍了make工具简介,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在Linux C/C++的开发过程中,当源代码文件较少时,我们可以手动使用gcc或g++进行编译链接,但是当源代码文件较多且依赖变得复杂时,我们就需要一种简单好用的工具来帮助我们管理。于是,make应运而生。
@H_12_4@make主要用来管理C/C++项目,通过Makefile书写的规则来对项目中的源代码文件进行编译,生成可执行的程序。 @H_949_8@make流程 @H_12_4@make执行的主要过程如下:当在sHell中使用make命令时,make会寻找当前目录下的Makefile文件,根据该文件中的规则来确定依赖关系,如果一个文件所依赖的文件比这个文件要新,或者说修改时间更晚,那么make会根据Makefile中指明的命令来重新编译生成该文件。另外,make除了自动寻找定义了编译规则的Makefile文件外,还可以手动指明定义了规则的文件。比如:
$ make -f rule.txt # rule.txt中为make规则@H_47_16@makefile的写法
目标 : 条件 [tab] 命令
其中,需要在命令之前加一个Tab制表符,并且条件和命令都是可以省略的,但是只能省略其一,条件省略时一般做一些编译以外的其他工作,当命令省略时其实也可以对目标进行编译生成,这涉及到了Makefile中的隐式规则,这里不过多赘述,我们只讨论显式规则。
如make流程所述,当条件中的文件比目标要新时,会执行tab后的命令。
@H_12_4@makefile中有很多规则时,当在sHell中执行@H_219_29@make命令,默认会将第一条规则的目标作为最终生成的目标。比如下面这个Makefile例子:
@H_595_14@main: main.o sub.o gcc -o main main.o sub.o sub.o: sub.c sub.h gcc -c -o sub.o sub.c main.o: main.c sub.h gcc -c -o main.o main.c clean: rm sub.o main.o .PHONY: clean当我们在sHell中执行make时,会最终生成@H_219_29@main这个最终目标。
但是如果我们只想生成某个中间的目标也是可以的,比如只生成sub.o
,只需要采用@H_219_29@make 最终目标的形式就可以了,即@H_219_29@make sub.o
注意到示例中省略了条件的那条规则(目标为clean的那条规则),正规上把它叫做伪目标,用来执行一些其他的任务,如本例中清除编译中生成的.o文件。当然,伪目标下的命令可以是多种多样的,比如将clean
下的命令改为ls
,当执行@H_219_29@make clean时,会列出当前目录下的所有文件。但是有一点@R_262_9570@是,如果我们的目录下已经有了一个叫做clean的文件,当我们执行@H_219_29@make clean时,make就分不清这个clean到底是那个了,为了避免这种情况,需要用.PHONY: 伪目标1,伪目标2..
的方式来显式的声明伪目标。
当我们Makefile中的规则变得非常多时,为了方便,也为了可维护性,我们一般使用变量来代替某些信息。
@H_12_4@makefile中定义变量的格式如下:变量名 := 变量值
其中:=
也该以使用=
,依个人喜好。用$(变量名)
的形式来使用变量。
先前示例中便可精简如下:
CC := gcc LD := gcc CFLAGS := -c OBJS := main.o sub.o main: $(OBJS) $(LD) -o main $(OBJS) sub.o: sub.c sub.h $(CC) $(CFLAGS) -o sub.o sub.c main.o: main.c sub.h $(CC) $(CFLAGS) -o main.o main.c clean: rm $(OBJS) .PHONY: clean
$(CC)
代表默认的C编译器,$(CXX)
代表默认的C++编译器。更多内置变量请参考这里
变量名 | 作用 |
---|---|
[email protected] |
目标的文件名 |
$< |
第一个条件的文件名 |
$? |
时间戳在目标之后的所有条件,并以空格隔开这些条件 |
$^ |
所有条件的文件名,并以空格隔开,且排除了重复的条件 |
$+ |
与$^ 类似,只是没有排除重复条件 |
$* |
目标的主文件名,不包含扩展名 |
CC := gcc LD := gcc CFLAGS := -c OBJS := main.o sub.o main: $(OBJS) $(LD) -o [email protected] $^ sub.o: sub.c sub.h $(CC) $(CFLAGS) -o [email protected] $< main.o: main.c sub.h $(CC) $(CFLAGS) -o [email protected] $< clean: rm $(OBJS) .PHONY: clean
另外,尽管make工具常常用来管理C/C++项目,但是用来管理其他项目也是可以的,比如汇编项目,Pascal项目,甚至是node.js的项目,make就是一个工具,来帮我们管理一些构建的规则,只要规则写的得当,怎么用就随你了。
最后,make虽然可以很好来管理项目了,但是还是不够方便。试想一下,当Makefile中的规则越来越多,又臭又长的时候,make就又显得很难用了,这也就是为什么cmake诞生的原因。通过编写Cmakelist,来指导cmake生成各种Makefile文件和project文件,从而减轻管理Makefile的负担。
参考:
以上是大佬教程为你收集整理的make工具简介全部内容,希望文章能够帮你解决make工具简介所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。