"make all" 究竟是如何运作的?
How exactly "make all" works?
所以我正在研究makefiles的用法。假设我有很多函数 fun_i.c
,其中 i 在 [1,100] 中。我将它们全部写在单独的 .c 文件中,以便在我只更改其中一些时进行更快的编译。我需要创建一个 Makefile。我在想这样的事情:
all : program
program: fun1.o fun2.o ........ fun100.o main.o
gcc -o program fun1.o fun2.o ..... fun100.o
fun1.o: fun1.c
gcc -c fun1.c
.
.
.
fun100.o: fun100.c
gcc -c fun100.c
main.o : main.c
gcc -c main.c
我在网上阅读了很多文章,讨论目标“all”如何确保每次我更改函数中的某些内容并调用 make 它只会更新更改的内容(因此我将避免不必要的重新编译).
但是,我不确定我是否在这里使用它。我检查了我的 makefile(虽然有 2 个函数)并且工作正常。但我不确定这是否是利用 all
的方法。
我试图将其删除,然后将 program
及以下.. 留在那里并且它工作正常。
我错过了什么?
您能否举例说明一切都很关键?
你的 makefile 没问题,有和没有 all: program
。
all
一词在makefile中没有特殊意义,using只是约定俗成。在您的 makefile 中 all
没有配方(即没有与之关联的命令),因此 make all
和 make program
是等价的。
请注意,如果您在调用 Make 时未指定目标(例如 make
而不是 make program
),则会构建 makefile 中的第一个目标。
I 've read many articles online talking about how the target "all" makes sure that everytime I change something in a function and I call make it will update only what changes
all
没有任何意义。这只是一个约定。您必须正确定义目标才能执行您想要的操作。如果您希望 make all
重新编译所有内容,您需要对其进行定义以便它执行此操作。
so I'm going to avoid uneccessary recompilation
在实践中,我会说这是一个完全没有必要的问题,创建执行此操作的 makefile 是浪费时间。如果您有一个大型项目,则不应手动创建 makefile。您使用像 cmake 这样的构建系统。
如果项目很小,只包含几个文件,那么编译时间一般不是问题。对于一个小项目,我使用 makefile 的目标是不必一直键入编译器标志。
这是一个 makefile,适用于大多数非常小的项目,例如学校作业:
CFLAGS=-Wall -Wextra -pedantic -std=c17 -fsanitize=address
LIBS=-lm -lpthread
program:
gcc $(CFLAGS) $(LIBS) *.c
clean:
rm -rf *.o *~
所以我正在研究makefiles的用法。假设我有很多函数 fun_i.c
,其中 i 在 [1,100] 中。我将它们全部写在单独的 .c 文件中,以便在我只更改其中一些时进行更快的编译。我需要创建一个 Makefile。我在想这样的事情:
all : program
program: fun1.o fun2.o ........ fun100.o main.o
gcc -o program fun1.o fun2.o ..... fun100.o
fun1.o: fun1.c
gcc -c fun1.c
.
.
.
fun100.o: fun100.c
gcc -c fun100.c
main.o : main.c
gcc -c main.c
我在网上阅读了很多文章,讨论目标“all”如何确保每次我更改函数中的某些内容并调用 make 它只会更新更改的内容(因此我将避免不必要的重新编译).
但是,我不确定我是否在这里使用它。我检查了我的 makefile(虽然有 2 个函数)并且工作正常。但我不确定这是否是利用 all
的方法。
我试图将其删除,然后将 program
及以下.. 留在那里并且它工作正常。
我错过了什么?
您能否举例说明一切都很关键?
你的 makefile 没问题,有和没有 all: program
。
all
一词在makefile中没有特殊意义,using只是约定俗成。在您的 makefile 中 all
没有配方(即没有与之关联的命令),因此 make all
和 make program
是等价的。
请注意,如果您在调用 Make 时未指定目标(例如 make
而不是 make program
),则会构建 makefile 中的第一个目标。
I 've read many articles online talking about how the target "all" makes sure that everytime I change something in a function and I call make it will update only what changes
all
没有任何意义。这只是一个约定。您必须正确定义目标才能执行您想要的操作。如果您希望 make all
重新编译所有内容,您需要对其进行定义以便它执行此操作。
so I'm going to avoid uneccessary recompilation
在实践中,我会说这是一个完全没有必要的问题,创建执行此操作的 makefile 是浪费时间。如果您有一个大型项目,则不应手动创建 makefile。您使用像 cmake 这样的构建系统。
如果项目很小,只包含几个文件,那么编译时间一般不是问题。对于一个小项目,我使用 makefile 的目标是不必一直键入编译器标志。
这是一个 makefile,适用于大多数非常小的项目,例如学校作业:
CFLAGS=-Wall -Wextra -pedantic -std=c17 -fsanitize=address
LIBS=-lm -lpthread
program:
gcc $(CFLAGS) $(LIBS) *.c
clean:
rm -rf *.o *~