0

我有一个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 编译器之后出现在第二行而不是在行尾?

4

1 回答 1

3

因为这条规则:

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

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

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

于 2013-09-17T23:30:00.640 回答