C、重构Makefile
C, Refactoring Makefile
我的 makefile 可以工作,但是如果我删除 debutliste.o lecturefichier.o statistiques.o tri.o
从目标编译,它仍然有效我想 bc 它们是在其他 .o 目标中完成的。
Make: link
compile: listechainee.o debutliste.o lecturefichier.o statistiques.o tri.o
listechainee.o: listechainee.c listechainee.h debutliste.o
gcc -g -Wall -Wextra -std=c11 -c listechainee.c
debutliste.o: debutliste.c debutliste.h lecturefichier.o
gcc -g -Wall -Wextra -std=c11 -c debutliste.c
lecturefichier.o: lecturefichier.c lecturefichier.h statistiques.o
gcc -g -Wall -Wextra -std=c11 -c lecturefichier.c
statistiques.o: statistiques.c statistiques.h tri.o
gcc -g -Wall -Wextra -std=c11 -c statistiques.c
tri.o: tri.c
gcc -g -Wall -Wextra -std=c11 -c tri.c
clean:
rm -rf *.o
link: compile
gcc *.o -o tri
如果我理解正确,我应该删除 .o 目标中的 debutliste.o lecturefichier.o statistiques.o tri.o
,因为它们将作为目标编译的依赖项执行,它应该如下所示?
Make: link
compile: listechainee.o debutliste.o lecturefichier.o statistiques.o tri.o
listechainee.o: listechainee.c listechainee.h
gcc -g -Wall -Wextra -std=c11 -c listechainee.c
debutliste.o: debutliste.c debutliste.h
gcc -g -Wall -Wextra -std=c11 -c debutliste.c
lecturefichier.o: lecturefichier.c lecturefichier.h
gcc -g -Wall -Wextra -std=c11 -c lecturefichier.c
statistiques.o: statistiques.c statistiques.h
gcc -g -Wall -Wextra -std=c11 -c statistiques.c
tri.o: tri.c
gcc -g -Wall -Wextra -std=c11 -c tri.c
clean:
rm -rf *.o
link: compile
gcc *.o -o tri
是的。如果您使用的是 GNU Make,您可以根据它已经有一个 catalog of rules 的事实来简化您的 makefile(按照上述)。这些规则告诉 make 如何将 c 文件编译成目标文件,以及如何 link 将目标文件编译成二进制文件。 rm
的递归标志 -r
让我很紧张,所以我删除了它。您可能不需要单独的 link 步骤,所以我使用标准 all
目标而不是 compile
:
.PHONY: all clean
CFLAGS:=-g -Wall -Wextra -std=c11
all: tri
clean:
rm -f *.o ./tri
tri: listechainee.o debutliste.o lecturefichier.o statistiques.o tri.o
debutliste.o: debutliste.c debutliste.h
lecturefichier.o: lecturefichier.c lecturefichier.h
listechainee.o: listechainee.c listechainee.h
statistiques.o: statistiques.c statistiques.h
如果你想要花哨的,你可以使用模式规则 %.o: %.c %h
说给定文件 .o 取决于它对应的 .c 和 .h 文件,这使得 makefile 非常紧凑:
.PHONY: all clean
CFLAGS:=-g -Wall -Wextra -std=c11
all: tri
clean:
rm -f *.o ./tri
tri: listechainee.o debutliste.o lecturefichier.o statistiques.o tri.o
%.o: %.c %h
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<
目标文件列表可能只是所有具有不同名称的 c 文件。您可以将其写为:
OBJECTS:=$(patsubst %.c,%.o,$(wildcard *.c))
tri: $(OBJECTS)
但是,我通常不会在我的项目中执行该步骤,因为构建现在对我在工作时经常创建的临时 .c 文件很敏感。
我的 makefile 可以工作,但是如果我删除 debutliste.o lecturefichier.o statistiques.o tri.o
从目标编译,它仍然有效我想 bc 它们是在其他 .o 目标中完成的。
Make: link
compile: listechainee.o debutliste.o lecturefichier.o statistiques.o tri.o
listechainee.o: listechainee.c listechainee.h debutliste.o
gcc -g -Wall -Wextra -std=c11 -c listechainee.c
debutliste.o: debutliste.c debutliste.h lecturefichier.o
gcc -g -Wall -Wextra -std=c11 -c debutliste.c
lecturefichier.o: lecturefichier.c lecturefichier.h statistiques.o
gcc -g -Wall -Wextra -std=c11 -c lecturefichier.c
statistiques.o: statistiques.c statistiques.h tri.o
gcc -g -Wall -Wextra -std=c11 -c statistiques.c
tri.o: tri.c
gcc -g -Wall -Wextra -std=c11 -c tri.c
clean:
rm -rf *.o
link: compile
gcc *.o -o tri
如果我理解正确,我应该删除 .o 目标中的 debutliste.o lecturefichier.o statistiques.o tri.o
,因为它们将作为目标编译的依赖项执行,它应该如下所示?
Make: link
compile: listechainee.o debutliste.o lecturefichier.o statistiques.o tri.o
listechainee.o: listechainee.c listechainee.h
gcc -g -Wall -Wextra -std=c11 -c listechainee.c
debutliste.o: debutliste.c debutliste.h
gcc -g -Wall -Wextra -std=c11 -c debutliste.c
lecturefichier.o: lecturefichier.c lecturefichier.h
gcc -g -Wall -Wextra -std=c11 -c lecturefichier.c
statistiques.o: statistiques.c statistiques.h
gcc -g -Wall -Wextra -std=c11 -c statistiques.c
tri.o: tri.c
gcc -g -Wall -Wextra -std=c11 -c tri.c
clean:
rm -rf *.o
link: compile
gcc *.o -o tri
是的。如果您使用的是 GNU Make,您可以根据它已经有一个 catalog of rules 的事实来简化您的 makefile(按照上述)。这些规则告诉 make 如何将 c 文件编译成目标文件,以及如何 link 将目标文件编译成二进制文件。 rm
的递归标志 -r
让我很紧张,所以我删除了它。您可能不需要单独的 link 步骤,所以我使用标准 all
目标而不是 compile
:
.PHONY: all clean
CFLAGS:=-g -Wall -Wextra -std=c11
all: tri
clean:
rm -f *.o ./tri
tri: listechainee.o debutliste.o lecturefichier.o statistiques.o tri.o
debutliste.o: debutliste.c debutliste.h
lecturefichier.o: lecturefichier.c lecturefichier.h
listechainee.o: listechainee.c listechainee.h
statistiques.o: statistiques.c statistiques.h
如果你想要花哨的,你可以使用模式规则 %.o: %.c %h
说给定文件 .o 取决于它对应的 .c 和 .h 文件,这使得 makefile 非常紧凑:
.PHONY: all clean
CFLAGS:=-g -Wall -Wextra -std=c11
all: tri
clean:
rm -f *.o ./tri
tri: listechainee.o debutliste.o lecturefichier.o statistiques.o tri.o
%.o: %.c %h
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<
目标文件列表可能只是所有具有不同名称的 c 文件。您可以将其写为:
OBJECTS:=$(patsubst %.c,%.o,$(wildcard *.c))
tri: $(OBJECTS)
但是,我通常不会在我的项目中执行该步骤,因为构建现在对我在工作时经常创建的临时 .c 文件很敏感。