如何调试makefile

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调试makefile相关的知识,希望对你有一定的参考价值。

参考技术A 调试makefile的步骤如下,
一、make的退出码
make命令执行后有三个退出码:
0 —— 表示成功执行。

1 —— 如果make运行时出现任何错误,其返回1。

2 —— 如果你使用了make的“-q”选项,并且make使得一些目标不需要更新,那么返回2。
Make的相关参数我们会在后续章节中讲述。
二、指定Makefile

前面我们说过,GNU make找寻默认的Makefile的规则是在当前目录下依次找三个文件——“GNUmakefile”、“makefile”和“Makefile”。其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行。

当前,我们也可以给make命令指定一个特殊名字的Makefile。要达到这个功能,我们要使用make的“-f”或是“--file”参数(“--makefile”参数也行)。例如,我们有个makefile的名字是“hchen.mk”,那么,我们可以这样来让make来执行这个文件:

make –f hchen.mk
如果在make的命令行是,你不只一次地使用了“-f”参数,那么,所有指定的makefile将会被连在一起传递给make执行。

三、指定目标

一般来说,make的最终目标是makefile中的第一个目标,而其它目标一般是由这个目标连带出来的。这是make的默认行为。当然,一般来说,你的makefile中的第一个目标是由许多个目标组成,你可以指示make,让其完成你所指定的目标。要达到这一目的很简单,需在make命令后直接跟目标的名字就可以完成(如前面提到的“make clean”形式)

任何在makefile中的目标都可以被指定成终极目标,但是除了以“-”打头,或是包含了“=”的目标,因为有这些字符的目标,会被解析成命令行参数或是变量。甚至没有被我们明确写出来的目标也可以成为make的终极目标,也就是说,只要make可以找到其隐含规则推导规则,那么这个隐含目标同样可以被指定成终极目标。

四、检查规则

让的makefile中的规则执行起来,检查一下我们的命令,或是执行的序列。于是可以使用make命令的下述参数:
“-n”

“--just-print”

“--dry-run”
“--recon”
不执行参数,这些参数只是打印命令,不管目标是否更新,把规则和连带规则下的命令打印出来,但不执行,这些参数对于我们调试makefile很有用处。
“-t”
“--touch”

这个参数的意思就是把目标文件的时间更新,但不更改目标文件。也就是说,make假装编译目标,但不是真正的编译目标,只是把目标变成已编译过的状态。
五、make的参数
下面列举了所有GNU make 3.80版的参数定义。其它版本和产商的make大同小异,不过其它产商的make的具体参数还是请参考各自的产品文档。
“-b”

“-m”

这两个参数的作用是忽略和其它版本make的兼容性。
“-B”
“--always-make”

认为所有的目标都需要更新(重编译)。
参考技术B 你好。Makefile不是linux上的吗,怎么会用vs2013生成,要么你装了qt助手!我自己一般习惯自己写!你试试在MSDN中搜vcbuild和msbuild如果我的回答没能帮助您,请继续追问。

如何调试makefile变量

回顾,这几年来大家问题我的问题,其实很多时候是makefile的调试问题。所以,就像我在之前的那篇关于GDB的技巧的文章中做的一样,在这里向大家介绍一个小小的调试变量的技巧。相信一定对你有用。 对于Makefile中的各种变量,可能是我们比较头痛的事了。我们要查看他们并不是很方便,需要修改makefile加入echo命令。这有时候很不方便。其实我们可以制作下面一个专门用来输出变量的makefile(假设名字叫:vars.mk) %: @echo '$*=$($*)' d-%: @echo '$*=$($*)' @echo ' origin = $(origin $*)' @echo ' value = $(value $*)' @echo ' flavor = $(flavor $*)' 这样一来,我们可以使用make命令的-f参数来查看makefile中的相关变量(包括make的内建变量,比如:COMPILE.c或MAKE_VERSION之类的)。注意:第二个以“d-”为前缀的目标可以用来打印关于这个变量更为详细的东西 (后面有详细说明)假设我们的makefile是这个样子(test.mk) OBJDIR := objdir OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o) foo = $(bar)bar = $(ugh)ugh = Huh? CFLAGS = $(include_dirs) -O include_dirs = -Ifoo -Ibar CFLAGS := $(CFLAGS) -Wall MYOBJ := a.o b.o c.o MYSRC := $(MYOBJ:.o=.c) 那么,我们可以这样进行调试: [hchen@RHELSVR5]$ make -f test.mk -f var.mk OBJS OBJS=objdir/foo.o objdir/bar.o objdir/baz.o [hchen@RHELSVR5]$ make -f test.mk -f var.mk d-foo foo=Huh? origin = file value = $(bar) flavor = recursive [hchen@RHELSVR5]$ make -f test.mk -f var.mk d-CFLAGS CFLAGS=-Ifoo -Ibar -O -O origin = file value = -Ifoo -Ibar -O -O flavor = simple [hchen@RHELSVR5]$ make -f test.mk -f var.mk d-COMPILE.c COMPILE.c=cc -Ifoo -Ibar -O -Wall -c origin = default flavor = recursive value = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c 我们可以看到:make的第一个-f后是要测试的makefile,第二个是我们的debug makefile。后面直接跟变量名,如果在变量名前加”d-”,则输出更为详细的东西。说一说”d-” 前缀(其意为details),其中调用了下面三个参数。$(origin):告诉你这个变量是来自哪儿,file表示文件,environment表示环境变量,还有environment override,command line,override,automatic等。$(value):打出这个变量没有被展开的样子。比如上述示例中的 foo 变量。 参考技术A

    对于Makefile中的各种变量,要查看并不是很方便,需要修改makefile加入echo命令。制作下面一个专门用来输出变量的makefile(假设名字叫:vars.mk)

vars.mk
@echo '$*=$($*)'

d-%:
@echo '$*=$($*)'
@echo ' origin = $(origin $*)'
@echo ' value = $(value $*)'
@echo ' flavor = $(flavor $*)'
@echo '$*=$($*)'

可以使用make命令的-f参数来查看makefile中的相关变量(包括make的内建变量,比如:COMPILE.c或MAKE_VERSION之类的)。注意:第二个以"d-"为前缀的目标可以用来打印关于这个变量更为详细的东西

以上是关于如何调试makefile的主要内容,如果未能解决你的问题,请参考以下文章

MakefileMakefile 中 LINUXINCLUDE 的作用

MakefileMakefile 中 LINUXINCLUDE 的作用

MakefileMakefile 中 LINUXINCLUDE 的作用

Makefile学习

make和makefile

Linux项目自动化构建工具-make/Makefile