c语言 - "make all"究竟是如何工作的?



所以我正在研究makefiles的用法。假设我有许多函数fun_i.c,其中我在[1100]中。我把它们都写在单独的.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 

我在网上读过很多文章,谈论的是目标;所有";确保每次我更改函数中的某些内容并调用make时,它只会更新更改的内容(所以我要避免未成功的重新编译(。然而,我不确定我是否在这里使用它。我检查了我的makefile(不过有两个函数(,它运行得很好。但我不确定这是否是利用all的方式。我试着把它取下来,只留下program和以下。。在那里,一切都很好。我错过了什么?你能举例说明一切都很关键吗?

我在网上读过很多文章,谈论目标;所有";确保每次我更改函数中的某些内容并调用make时,它只会更新更改的内容

all没有任何意义。这只是一个惯例。你必须正确定义目标才能做你想做的事。如果您希望make all重新编译所有内容,则需要对其进行定义,使其能够做到这一点。

所以我要避免未成功的重新编译

在实践中,我认为这是一个完全不必要的问题,创建这样的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 *~

无论有没有all: program,您的makefile都很好。

单词all在makefiles中没有特殊意义,使用只是一种约定。在您的生成文件中,all没有配方(即没有与之相关的命令(,因此make allmake program是等效的。

请注意,如果在调用Make时没有指定目标(例如make,而不是make program(,则会生成makefile中的第一个目标。

最新更新