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
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)
使用没有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,这导致配方执行.