在没有makefile的情况下使用make命令?

问题描述 投票:0回答:3

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

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

c makefile
3个回答
14
投票

Make 有一个带有隐式规则的内部数据库。您可以使用

make -p
列出它们。另外
make -d
会告诉您正在应用哪些规则,以便帮助您发现在这种情况下使用了哪些隐式规则。


12
投票

Make 有几个预定义的隐式规则。 特别是,在您的情况下,它在尝试确定对目标做什么时使用两个这样的规则

codeFile

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

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

7
投票

在没有makefile的情况下使用make命令?

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

根据 make 手册页

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
结尾的相同目标名称的文件名相匹配,这导致配方执行。

© www.soinside.com 2019 - 2024. All rights reserved.