使用没有makefile的make命令?

时间:2013-04-01 14:24:23

标签: c compiler-construction makefile

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

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

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:9)

Make有几个预先定义的implicit rules。特别是,在您的情况下,它在尝试确定目标codeFile的操作时使用了两个这样的规则:

%: %.o    # Link object file
    $(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)

%.o: %.c  # Compile C source code
    $(CC) $(CPPFLAGS) $(CFLAGS) -c

答案 2 :(得分:6)

  

使用不带makefile的make命令?

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

根据make man page

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变量也为空(to allow users to set values for various target architectures。)然后我们有:

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

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

cc     hello.c   -o hello

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