Makefile 制定重新安排规则?

Makefile 制定重新安排规则?,makefile,Makefile,我有一个Makefile,它在Ubuntu Linux 13.04上编译C代码。它看起来像这样: CC=gcc CFLAGS=-c -Wall LDFLAGS=-lm SOURCES=$(wildcard *.c) OBJECTS=$(SOURCES:.c=.o) EXECS=$(SOURCES:%.c=%) all: $(OBJECTS) $(EXECS) .c.o: $(CC) $(CFLAGS) $< -o $@ .o.: $(CC) -o $@ $

我有一个
Makefile
,它在Ubuntu Linux 13.04上编译C代码。它看起来像这样:

CC=gcc
CFLAGS=-c -Wall
LDFLAGS=-lm
SOURCES=$(wildcard *.c)
OBJECTS=$(SOURCES:.c=.o)
EXECS=$(SOURCES:%.c=%)

all: $(OBJECTS) $(EXECS)
.c.o:
        $(CC) $(CFLAGS) $< -o $@
.o.:
        $(CC) -o $@ $^ $(LDFLAGS)
为什么
-lm
出现在C编译器的第二行后面,而不是行的末尾?

因为这条规则:

.o.:
        $(CC) -o $@ $^ $(LDFLAGS)
没有效果。您正在告诉make如何构建名为
.o.
的文本文件,但由于您不尝试构建该文件,因此忽略此规则。如果试图指定单个后缀规则,则应简单地使用
.o
(无其他句点)

由于makefile没有定义要生成的规则
FILENAME
,因此make正在搜索其内置的隐式规则库,以找到一个用于生成可执行文件的规则库。在标准的内置规则库中,
LDFLAGS
变量用于链接器标志,如
-L
等,这些标志指定路径名,并应位于所有库之前。变量
LDLIBS
用于指定要链接的库,例如
-lm

,因为此规则:

.o.:
        $(CC) -o $@ $^ $(LDFLAGS)
没有效果。您正在告诉make如何构建名为
.o.
的文本文件,但由于您不尝试构建该文件,因此忽略此规则。如果试图指定单个后缀规则,则应简单地使用
.o
(无其他句点)


由于makefile没有定义要生成的规则
FILENAME
,因此make正在搜索其内置的隐式规则库,以找到一个用于生成可执行文件的规则库。在标准的内置规则库中,
LDFLAGS
变量用于链接器标志,如
-L
等,这些标志指定路径名,并应位于所有库之前。变量
LDLIBS
用于指定要链接的库,例如
-lm

顺便说一句,我不建议使用后缀规则。通过使用
$(通配符…
等,您已经承诺要使用GNU make,所以您最好使用模式规则。它们更容易阅读和理解。或者,不要费心编写任何规则,使用make的内置规则!这更好,除非你有一些他们不能满足的需求。还有PPS,你可以通过运行
make-p-f/dev/null
.Hmm来查看make的内置规则和变量库。我的理解是
all
规则要求将
$(对象)
构建为
$(EXECS)
的先决条件。为什么不是这样?为什么你认为不是这样?它建造了这些物体,对吗?是的,它正在建造这些物体,但是你的回答说上面的规则没有效果。所以它正在构建对象,但是没有使用构建对象的规则?顺便说一句,我不建议使用后缀规则。通过使用
$(通配符…
等,您已经承诺要使用GNU make,所以您最好使用模式规则。它们更容易阅读和理解。或者,不要费心编写任何规则,使用make的内置规则!这更好,除非你有一些他们不能满足的需求。还有PPS,你可以通过运行
make-p-f/dev/null
.Hmm来查看make的内置规则和变量库。我的理解是
all
规则要求将
$(对象)
构建为
$(EXECS)
的先决条件。为什么不是这样?为什么你认为不是这样?它建造了这些物体,对吗?是的,它正在建造这些物体,但是你的回答说上面的规则没有效果。所以它正在构建对象,但没有使用构建对象的规则?