Makefile未执行到底
我有下面的makefile,但它只是执行第一个命令,在那里它构建了.o文件,而不是.so文件。我做错了什么 谢谢Makefile未执行到底,makefile,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
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)
除非在命令行上指定不同的目标,否则make始终构建在makefile中找到的第一个实际目标。在本例中,第一个真正的目标是第一个对象文件,所以这就是构建的全部内容 这就是为什么您通常会看到第一个目标为
all
或类似的makefiles,这取决于在没有参数的标准“make”调用期间要构建的各种其他目标
然而,您的makefile在许多方面确实不正确。事实上,它正在运行这一切意味着您实际上只有一个源文件。一旦您的值大于1,它就会失败
这:
效率不高,;您应该在此处使用通配符:
SOURCES = $(wildcard ./*.c)
这条规则:
$(OBJECTS): $(SOURCES) $(HEADERS)
$(CC) $(CFLAGS) -c $(SOURCES) -o $(OBJECTS)
告诉make,“对于每个对象文件,如果任何源文件或任何头文件已更改,请重新编译它”。基本上,这意味着如果更改目录中的任何内容,所有内容都将重建。如果你想这样做,你可以写一个shell脚本,而不必为make操心
此外,当源文件>1时,编译器将失败,因为它将尝试运行:
gcc -g -Wall -c foo.c bar.c -o foo.o bar.o
这是不对的
你根本不需要定义这个规则;make有一个内置规则,它知道如何从源文件构建对象文件。只需将其替换为以下内容:
$(OBJECTS): $(HEADERS)
(无配方)因此make知道对象依赖于头和源。请注意,这并不理想,因为如果任何标题发生更改,所有对象都会重新生成,但对于一个简单的程序来说,这很好。您是否尝试了
制作Stepper。因此
?交换两个完整的规则$(对象):
和$(目标):
。
$(OBJECTS): $(HEADERS)