我不明白我使用教程创建的这个生成文件的某些部分

I don't understand some parts of this makefile that I have created using a tutorial

本文关键字:文件 些部 教程 创建 明白      更新时间:2023-10-16

下面是我按照教程中的步骤生成的生成文件

我只有两个mutexVsTomics.c和mutexVstomics.h,它们生成mutexVsThomics.o和runMutexVstomic(可执行文件)。

在本教程中,我们解释了以%o:开头的规则应该涵盖我更改.h文件然后编译c文件的情况。经过更多的阅读和示例,我注意到规则的:部分之后的任何内容都是"依赖项"列表,并将导致规则执行。

所以我只是在$(TARGET):规则中添加了.h(即$(DEPS))文件,如果我修改了头,它现在也会编译。所以我对一些事情感到困惑。

这是我完成教程后的代码/makefile。。。。一切似乎都奏效了:

# Target binary filename
TARGET = runMutexVsAtomic
# Compiler
CC = g++
# Compiler Flags
CFLAGS = -std=c++11
# Include paths
PATHS = -I.
# Libraries
LIBS = -lpthread
# Include files
DEPS = mutexVsAtomics.h
#Object files
OBJ = mutexVsAtomics.o
### WHAT DOES THIS REALLY DO?... WHAT IS `$<`?###
%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(PATHS) $(CFLAGS)
# Build rule - if any OBJ file or DEPS file is newer then target, then run the command line
$(TARGET): $(OBJ)    #### WHY NOT JUST ADD `$(DEPS)` HERE? ###
    $(CC) -o $@ $^ $(LIBS) $(PATHS) $(CFLAGS)
clean:
    rm -f ./*.o $(TARGET)

我在我的问题所在添加了评论,但在这里它们是明确的:

  1. $(TARGET): $(OBJ)规则中,为什么我应该/不应该只做$(TARGET): $(OBJ) $(DEPS)
  2. 你能更详细地解释一下%.o:规则吗?例如%.c为什么在那里?为什么那里有-c标志?什么是$<?为什么我们不指定$(LIBS)

在$(TARGET):$(OBJ)规则中,为什么我应该/不应该只做$(TARGET:$(OBJ$)(DEPS)?

runMutexVsAtomic不会立即依赖于mutexVsAtomics.h的内容,mutexVsAtomics.o会,除非您在一个步骤中制作图像,而您不在这里,因为您显式地创建了一个中间对象文件。

你能更详细地解释一下规则%.o:吗?例如,为什么有%.c?为什么那里有-c标志?什么是$

%开头的规则是与指定模式匹配的模式规则。%.c中的%将替换目标中.o之前出现的任何内容(附带说明:由于您使用的是g++-std=c++11,因此此规则看起来应该是%.cpp%.cc)。

-c是编译器标志,它告诉编译器只编译而不链接最终图像,即制作对象文件。

CCD_ 23是用第一个先决条件代替的生成自动变量。

制作对象时没有指定LIBS,因为在此步骤中没有链接。

请记住,make已经有了你正在做的事情的食谱,所以通过一些小的调整,你的makefile可以缩短如下:

TARGET   := mutexVsAtomics
OBJS     := mutexVsAtomics.o
CC       := g++
CPPFLAGS := -MMD
CXXFLAGS := -std=c++11
LDLIBS   := -lpthread
$(TARGET): $(OBJS)
.PHONY: clean
clean: ; $(RM) $(OBJS) $(OBJS:.o=.d) $(TARGET)
-include $(OBJS:.o=.d)