使用没有makefile的make命令?

我正在为一个赋值编译一些C代码,我运行了“make codeFile”,其中“codeFile”是我的C程序的名称,即使我没有makefile,也创建了一个可执行文件,它运行并运行正确。

有谁知道为什么这有效? 即使我没有makefile,为什么make会编译? 我能找到的唯一参考是: http : //daly.axiom-developer.org/TimothyDaly_files/class5/node5.html

Make有一个带有隐式规则的内部数据库。 您可以使用make -p列出它们。 同时make -d将告诉您正在应用哪些规则,这样可以帮助您发现在这种情况下使用的隐式规则。

Make有几个预定义的隐式规则 。 特别是,在您的情况下,它在尝试确定如何为目标codeFile执行操作时使用两个这样的规则:

 %: %.o # Link object file $(CC) $(LDFLAGS) no $(LOADLIBES) $(LDLIBS) %.o: %.c # Compile C source code $(CC) $(CPPFLAGS) $(CFLAGS) -c 

使用没有makefile的make命令?

make具有作为默认值的隐式规则,除非您覆盖它们。

根据make man页面 :

 make -p -f/dev/null 

将列出所有隐式规则(和相关环境变量),而不尝试实际重制文件。

为了演示用法,我在Cygwin中运行make ,它给了我一个exe文件。 注意传递给make的名称没有.c

 $ ls hello.c $ make hello cc hello.c -o hello $ ls hello.c hello.exe 

我也在Ubuntu Linux中运行它,我的结果与上面几乎相同,但是.exe扩展名不在那里,而是我有普通的hello可执行文件:

 $ ls hello.c hello 

逐步推导

我相信make隐含规则的相关部分如下:

 CC = cc 

cc别名为CC

 LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) 

创建LINK格式,其中标志为空, TARGET_ARCH变量也为空( 允许用户为各种目标体系结构设置值 。)然后我们有:

 %: %.c # recipe to execute (built-in): $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@ 

^变量是先决条件hello.c 。 其他变量是空的。 其后是-o标志和目标名称。 空变量解释命令make ran中的额外空格:

 cc hello.c -o hello 

并且%: %.c将给定的目标与以.c结尾的相同目标名称的文件名匹配,这导致配方执行。