使用没有makefile的make命令?

lu6*_*fer 10 c compiler-construction makefile

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

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

Jor*_*ñez 11

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


Oli*_*rth 9

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

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

%.o: %.c  # Compile C source code
    $(CC) $(CPPFLAGS) $(CFLAGS) -c
Run Code Online (Sandbox Code Playgroud)


Aar*_*all 6

使用没有makefile的make命令?

make 除非您覆盖它们,否则隐式规则可用作默认值.

根据make man页面:

make -p -f/dev/null
Run Code Online (Sandbox Code Playgroud)

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

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

$ ls
hello.c
$ make hello
cc     hello.c   -o hello
$ ls
hello.c  hello.exe
Run Code Online (Sandbox Code Playgroud)

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

$ ls
hello.c  hello
Run Code Online (Sandbox Code Playgroud)

逐步推导

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

CC = cc
Run Code Online (Sandbox Code Playgroud)

cc 别名 CC

LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
Run Code Online (Sandbox Code Playgroud)

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

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

^变量是前提,hello.c.其他变量是空的.其后是-o标志和目标名称.空变量解释命令make ran中的额外空格:

cc     hello.c   -o hello
Run Code Online (Sandbox Code Playgroud)

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