我正在研究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
或将所有内容保留在隐式规则中。我对吗?
另一个问题是为什么他使用::
而不是:
这里?我没有在网上找到有关此的有用信息。多谢你们!
教授将预处理结果保存在另一个文件中
不对。根据您的说法makefile
,预处理结果不会存储在任何文件中。预处理是在源文件上运行预处理器的结果,即它将替换头文件的内容代替#include
指令,并评估和替换宏。
相反,您会在makefile
中生成标头相关性规则并将其存储在中Makefile.dependencies
。生成头依赖项规则的-MM
键gcc
,以便在您编辑源文件所依赖的头文件之一的情况下,下次调用时将重新编译这些源文件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] 删除。
我来说两句