C语言基础教程-- 编译智能化之Makefile应用
本帖最后由 sunsili 于 2024-4-3 18:01 编辑C语言基础教程-- 编译智能化之Makefile应用
static/image/hrline/4.gif
引言
我们写好的代码需要编译,是不是每次都要输入
gcc -o hello.exe hello.c
一切为了偷懒
古人云:”勤劳能致富“。
余昧,思之:”不然,古时农民多是勤劳之人,然之非富也。余以为懒为社会发展之源也。“
现在文件少,还好写,文件多了,这个样写,写完成这个语句都要天亮了,那我们怎么办呢?聪明的前人,就发明了Makefile, 写代码按一定规则编译,输入
make即可
我们试着新建文文档,输入
gcc -o hello.exe hello.c保存为Makefile,注意没有后缀
打开命令提示符,到源码目录,输入
make再输入
hello.exe和我们要得到结果是一样的。
再更改一下Makefile
tag = hello.exe
obj = hello.o
src += hello.c
cc = gcc
all: $(obj)
$(cc) -o $(tag) $(obj)
run: $(tag)
$(tag)
%.o: %.c
$(cc) -c $(CFLAGS) [ DISCUZ_CODE_198 ]lt; -o $@
clean:
rm -f *.o注释:
目标:依赖
<Tab键> (编译命令或Linux命令)
obj = hello.o
hello:$(obj)//引用变量$(变量名)
gcc -o hello $(obj)
%.o : %.c //通配符 所有*.o 依赖于 *.c*.c编译得到*.0
gcc -c [ DISCUZ_CODE_55 ]lt;//表示第一个依赖
gcc -c $@//所有目标
gcc -c $^//所有依赖
伪目标:依赖
clean: //清理中间文件
rm hello.o
现在不理解,没关系,照做就好了。
以后再理解
输入
make 编译
输入
make run还可以运行
******原创文章,转载请说明出处****** 伪目标
最早先的一个例子中,我们提到过一个“clean”的目标,这是一个“伪目标”, clean: rm *.o temp正像我们前面例子中的“clean”一样,即然我们生成了许多文件编译文件,我们也应该提供一个清除它们的“目标”以备完整地重编译而用。 (以“make clean”来使用该目标)因为,我们并不生成“clean”这个文件。“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个“目标”才能让其生效。当然,“伪目标”的取名不能和文件名重名,不然其就失去了“伪目标”的意义了。当然,为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。 .PHONY : clean只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”这样。于是整个过程可以这样写: .PHONY: clean clean: rm -f *.o 伪目标一般没有依赖的文件。但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。一个示例就是,如果你的Makefile需要一口气生成若干个可执行文件,但你只想简单地敲一个make完事,并且,所有的目标文件都写在一个Makefile中,那么你可以使用“伪目标”这个特性: all : prog1 prog2 prog3 .PHONY : all prog1 : prog1.o utils.o cc -o prog1 prog1.o utils.o prog2 : prog2.o cc -o prog2 prog2.o prog3 : prog3.o sort.o utils.o cc -o prog3 prog3.o sort.o utils.o我们知道,Makefile中的第一个目标会被作为其默认目标。我们声明了一个“all”的伪目标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那三个目标就总是不如“all”这个目标新。所以,其它三个目标的规则总是会被决议。也就达到了我们一口气生成多个目标的目的。“.PHONY : all”声明了“all”这个目标为“伪目标”。随便提一句,从上面的例子我们可以看出,目标也可以成为依赖。所以,伪目标同样也可成为依赖。看下面的例子: .PHONY: cleanall cleanobj cleandiff cleanall : cleanobj cleandiff rm program cleanobj : rm *.o cleandiff : rm *.diff“makeclean”将清除所有要被清除的文件。“cleanobj”和“cleandiff”这两个伪目标有点像“子程序”的意思。我们可以输入“makecleanall”和“make cleanobj”和“makecleandiff”命令来达到清除不同种类文件的目的
页:
[1]