Makefile没有执行到最后

时间:2014-04-16 12:15:17

标签: makefile

我有以下makefile,但它只执行第一个命令,它构建.o文件,而不是.so文件。我究竟做错了什么?

谢谢,

SHELL = /bin/sh
CC    = gcc
CFLAGS = -g -Wall 
LDFLAGS = -shared

TARGET  = Stepper.so
SOURCES = $(shell echo ./*.c)
HEADERS = $(shell echo ./*.h)
OBJECTS = $(SOURCES:.c=.o)
LIBS = liblua523.a

PREFIX = $(DESTDIR)/usr/local
BINDIR = $(PREFIX)/bin

$(OBJECTS): $(SOURCES) $(HEADERS)
    $(CC) $(CFLAGS) -c $(SOURCES) -o $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(LDFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)

clean: 
    rm $(OBJECTS)

1 个答案:

答案 0 :(得分:0)

除非在命令行中指定不同的目标,否则make始终构建在makefile中找到的第一个真实目标。在这种情况下,第一个真实目标是第一个目标文件,因此就是所有构建的目标文件。

这就是为什么你通常会看到第一个目标为all或类似的makefile,它只取决于你想要在没有参数的“make”标准调用期间构建的各种其他目标。

但是,你的makefile在很多方面都是不对的。它运行它的事实意味着你实际上只有一个源文件。只要你有> 1,它就会失败。

此:

SOURCES = $(shell echo ./*.c)

效率不高;你应该在这里使用通配符:

SOURCES = $(wildcard ./*.c)

这条规则:

$(OBJECTS): $(SOURCES) $(HEADERS)
        $(CC) $(CFLAGS) -c $(SOURCES) -o $(OBJECTS)

告诉make,“对于每个目标文件,如果任何源文件或任何头文件已更改,请重新编译它”。基本上,这意味着如果您更改目录中的ANYTHING,一切都将重建。如果你想要的话,你也可以编写一个shell脚本而不用make make。

此外,如果您有> 1个源文件,编译器将会失败,因为它会尝试运行:

gcc -g -Wall -c foo.c bar.c -o foo.o bar.o

这是不对的。

您根本不需要定义此规则; make有一个内置规则,它知道如何从源文件构建目标文件。只需将其替换为:

$(OBJECTS): $(HEADERS)

(没有食谱)所以make知道对象依赖于标题和源。请注意,这并不理想,因为如果任何标题更改,所有对象都会重建,但对于简单的程序来说这很好。