C “制造一切”到底是如何运作的?

C “制造一切”到底是如何运作的?,c,unix,makefile,gnu-make,C,Unix,Makefile,Gnu Make,所以我正在研究makefiles的用法。假设我在[1100]中有很多函数。我把它们都写在单独的.c文件中,以便在只修改其中一些文件时进行更快的编译。我需要创建一个Makefile。我是这样想的: 全部:程序 程序:fun1.o fun2.o。。。。。。。。fun100.o main.o gcc-o程序fun1.o fun2.o。。。。。fun100.o fun1.o:fun1.c gcc-c fun1.c . . . fun100.o:fun100.c gcc-c fun100.c main.o

所以我正在研究makefiles的用法。假设我在[1100]中有很多函数。我把它们都写在单独的.c文件中,以便在只修改其中一些文件时进行更快的编译。我需要创建一个Makefile。我是这样想的:

全部:程序 程序:fun1.o fun2.o。。。。。。。。fun100.o main.o gcc-o程序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-cmain.c 我在网上读过很多文章,其中谈到了目标函数如何确保每次我更改函数中的某些内容并调用make时,它只会更新所做的更改,从而避免不必要的重新编译。 然而,我不确定我是否在这里使用它。我用两个函数检查了我的makefile,结果很好。但我不确定这是否是利用这里一切的方式。 我试图删除它,只是离开了程序和下面。。在那里,一切都很好。 我错过了什么?
你能提供一些例子说明一切都很重要吗?

你的makefile很好,有或没有all:program

单词all在makefile中没有特殊意义,使用只是一种惯例。在makefile中,all没有配方,即没有与之相关联的命令,因此makeall和makeprogram是等效的

请注意,如果在调用Make时未指定目标,例如Make而不是Make程序,则生成makefile中的第一个目标

我在网上读过很多文章,其中谈到了目标函数如何确保每次我更改函数中的某些内容并调用make时,它只更新更改的内容

一切并不意味着什么。这只是一个惯例。你必须正确定义目标才能做你想做的事。如果您希望makeall重新编译所有内容,则需要对其进行定义,以便它能够做到这一点

所以我要避免不必要的重新编译

在实践中,我认为这是一个完全不必要的问题,而创建这样做的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基本上是makefile中程序的别名。这个名字没有什么神奇之处,它就像你可以使用的其他名字一样。建议:花几个小时阅读的文档,然后尝试make-p。。。。也许。。。。许多开源程序,包括my、or或。。。。有Makefile-s。有时,这些都是由生成的,例如…避免不必要的重新编译是make的一般行为,而不是任何特定目标的特殊函数。如果我添加以下内容:all:program及其下方的“`make program``与跳过all目标有什么不同吗?没有,它不会有任何区别,如果我把一个菜谱放在所有的下面:像makeprogram这样的程序,它与跳过所有目标并离开``program:f1.o…``没有区别?唯一的区别是,通过编写所有代码,我只需重命名可执行文件,而不用编写make程序write make all?如果我想用一个makefile创建两个可执行文件,那么使用all:program1program2会更有意义吗?