C “清洁”导致“全部制造”失败

C “清洁”导致“全部制造”失败,c,gcc,makefile,C,Gcc,Makefile,当我在没有clean的情况下执行这个Makefile时,它的功能正常,并且共享库和主可执行文件都被正确创建。但是,当我添加clean目标时,makeall失败。原因可能是什么 CC = gcc CFLAGS = -fPIC -Wall -Werror LDFLAGS = -shared TARGET_LIB= libnsd.so lib: nsd.o nd.o $(CC) $(LDFLAGS) -o ${TARGET_LIB} nsd.o nd.o -lm nd.o : nd

当我在没有clean的情况下执行这个Makefile时,它的功能正常,并且共享库和主可执行文件都被正确创建。但是,当我添加clean目标时,makeall失败。原因可能是什么

CC = gcc
CFLAGS = -fPIC -Wall -Werror 
LDFLAGS = -shared  

TARGET_LIB= libnsd.so

lib: nsd.o nd.o
    $(CC) $(LDFLAGS) -o ${TARGET_LIB} nsd.o nd.o -lm

nd.o : nd.c nd.h
    $(CC) -c $(CFLAGS) nd.c

nsd.o : nsd.c nsd.h
    $(CC) -c $(CFLAGS) nsd.c

all: main.c
    $(CC) -o -I. -L. main.c  -lnsd

clean:
    rm -f libnsd.so nd.o nsd.o
您的all:target需要依赖于lib目标,因此首先构建库

编译器的-o参数还需要它应该创建的可执行文件的名称

all: lib main.c
    $(CC) -o main -I. -L. main.c  -lnsd
通常,您希望目标名称是您创建的文件,否则在不需要时会重新生成。lib:target有相同的问题,但作为可执行文件的示例:

.PHONY: all
all: lib main

main: lib main.c
    $(CC) -o main -I. -L. main.c  -lnsd

诺斯的答案是正确的

它以前似乎只起作用,因为您碰巧按正确的顺序运行make。在一个干净的操作之后,它将不起作用,因为正如nos指出的,您还没有声明所有的先决条件。链接main.o的规则必须依赖于共享库目标,因此make知道构建东西的正确顺序

另外,您确实希望您的目标是您正在构建的实际文件。如果它们是别的东西,make会一直认为它们过时了,即使你没有改变任何东西,也会一直重建它们

这样会更好:

CC = gcc
CFLAGS = -fPIC -Wall -Werror
CPPFLAGS = -I.
LDFLAGS = -shared  

PROGRAM = main
TARGET_LIB= libnsd.so

all: $(PROGRAM)

$(PROGRAM): main.o $(TARGET_LIB)
        $(CC) -o $@ -L. main.o  -lnsd

$(TARGET_LIB): nsd.o nd.o
        $(CC) $(LDFLAGS) -o $@ nsd.o nd.o -lm

nd.o : nd.c nd.h
nsd.o : nsd.c nsd.h

clean:
        rm -f libnsd.so *.o

哎呀,诺斯用我编辑的观点更新了他的答案。。。对不起,被骗了!