Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile未执行到底_Makefile - Fatal编程技术网

Makefile未执行到底

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

我有下面的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)

除非在命令行上指定不同的目标,否则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)