我有一个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编译器之后而不是行的末尾?
答案 0 :(得分:3)
因为这条规则:
.o.:
$(CC) -o $@ $^ $(LDFLAGS)
无效。您正在告诉如何构建名为.o.
的文字文件,但由于您没有尝试构建该文件,因此忽略此规则。如果您尝试指定单后缀规则,则应该只使用.o
(无其他时间段)。
因为你的makefile没有定义构建FILENAME
的规则,所以make正在搜索其隐式规则的内置库,以找到构建可执行文件的库。在标准的内置规则库中,LDFLAGS
变量用于链接器标志,如-L
等,它们指定路径名,应该在所有库之前。变量LDLIBS
用于指定要链接的库,例如-lm
。