制定重新安排规则?

时间:2013-09-17 23:23:54

标签: 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 $@ $^ $(LDFLAGS)

现在,ld希望$(LDFLAGS)出现在我将其放在上面的行的末尾。当我在make上运行Makefile时,我得到以下类型的输出:

$ make
gcc -c -Wall FILENAME.c -o FILENAME.o
...
gcc -lm  FILENAME.o   -o FILENAME
...

为什么-lm出现在第二行的C编译器之后而不是行的末尾?

1 个答案:

答案 0 :(得分:3)

因为这条规则:

.o.:
        $(CC) -o $@ $^ $(LDFLAGS)

无效。您正在告诉如何构建名为.o.的文字文件,但由于您没有尝试构建该文件,因此忽略此规则。如果您尝试指定单后缀规则,则应该只使用.o(无其他时间段)。

因为你的makefile没有定义构建FILENAME的规则,所以make正在搜索其隐式规则的内置库,以找到构建可执行文件的库。在标准的内置规则库中,LDFLAGS变量用于链接器标志,如-L等,它们指定路径名,应该在所有库之前。变量LDLIBS用于指定要链接的库,例如-lm