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)
的先决条件。为什么不是这样?为什么你认为不是这样?它建造了这些物体,对吗?是的,它正在建造这些物体,但是你的回答说上面的规则没有效果。所以它正在构建对象,但没有使用构建对象的规则?