关于自动生成Makefile先决条件

shen

我正在研究Stanford CS107作业3,在其中我们实现了C版本“ vector”。最后,我的目录中有一些文件,

.
├── Makefile
├── bool.h
├── vector.c
├── vector.h
└── vectortest.c

我的问题是关于讲义Makefile,看起来像这样,

CC = gcc
CFLAGS = -g -Wall -std=gnu11 -Wpointer-arith
LDFLAGS = 

VECTOR_SRCS = vector.c
VECTOR_HDRS = $(VECTOR_SRCS:.c=.h)

VECTOR_TEST_SRCS = vectortest.c $(VECTOR_SRCS)
VECTOR_TEST_OBJS = $(VECTOR_TEST_SRCS:.c=.o)

SRCS = $(VECTOR_SRCS) vectortest.c
HDRS = $(VECTOR_HDRS)  

EXECUTABLES = vector-test 

default: $(EXECUTABLES)

vector-test: Makefile.dependencies $(VECTOR_TEST_OBJS)
    $(CC) $(CFLAGS) -o $@ $(VECTOR_TEST_OBJS) $(LDFLAGS)

# The dependencies below make use of make's default rules,
# under which a .o automatically depends on its .c and
# the action taken uses the $(CC) and $(CFLAGS) variables.
# These lines describe a few extra dependencies involved.
Makefile.dependencies:: $(SRCS) $(HDRS)
    $(CC) $(CFLAGS) -MM $(SRCS) > Makefile.dependencies

-include Makefile.dependencies

.PHONY: clean
clean:
    -rm -fr $(EXECUTABLES) *.o core Makefile.dependencies

当我运行时make vector-test,会Makefile.dependencies生成一个文件,其中包含一些make的“默认规则”,

vector.o: vector.c vector.h bool.h
vectortest.o: vectortest.c vector.h bool.h

我的问题是:教授将预处理结果保存在另一个文件中只是为了向我们展示“默认规则”是什么,还是出于效率原因?例如,使用预编译头文件的GNU-GCC-3.22是否可以通过防止编译程序反复处理头文件来节省时间?因为通常我们不必列出所有.h文件,而只需列出gcc -c vector.c或将所有内容保留在隐式规则中。我对吗?

另一个问题是为什么他使用::而不是:这里?我没有在网上找到有关此的有用信息。多谢你们!

igagis

教授将预处理结果保存在另一个文件中

不对。根据您的说法makefile,预处理结果不会存储在任何文件中。预处理是在源文件上运行预处理器的结果,即它将替换头文件的内容代替#include指令,并评估和替换宏。

相反,您会在makefile中生成标头相关性规则并将其存储在中Makefile.dependencies生成头依赖项规则-MMgcc,以便在您编辑源文件所依赖的头文件之一的情况下,下次调用时将重新编译这些源文件make

makefile然后,在其中包含带有的生成的依赖关系规则-include Makefile.dependencies,以便make拾取由先前make调用生成的标头依赖关系规则的内容Makefile.dependencies,因为你已经注意到了,是一个有效的makefile语法。

有关更多信息,请参见https://www.gnu.org/software/make/manual/html_node/Automatic-Prerequisites.html

因此,这是出于效率原因,因此,在某些标头文件被编辑的情况下,首先要进行清理,从而可以避免全部重建。但这也是一个方便的原因,如果您已编辑了某些头文件,则不必担心记住要清理和重建所有内容。make实用程序将仅重建受影响的源文件。

预编译头与此无关。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章