我有以下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)
答案 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知道对象依赖于标题和源。请注意,这并不理想,因为如果任何标题更改,所有对象都会重建,但对于简单的程序来说这很好。