C “清洁”导致“全部制造”失败
当我在没有clean的情况下执行这个Makefile时,它的功能正常,并且共享库和主可执行文件都被正确创建。但是,当我添加clean目标时,makeall失败。原因可能是什么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
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
哎呀,诺斯用我编辑的观点更新了他的答案。。。对不起,被骗了!