簡體   English   中英

我不理解我使用教程創建的這個makefile的某些部分

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

下面是我通過從這里按照教程中的步驟生成的makefile

我只有兩個mutexVsAtomics.c和mutexVsAtomics.h,它們產生mutexVsAtomics.o和runMutexVsAtomic(可執行文件)。

在本教程中,解釋了以%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.h mutexVsAtomics.o ,除非你在一步中制作圖像,因為你明確地創建了一個中間目標文件,所以你不在這里。

你能解釋一下規則%.o:更多細節嗎? 例如,為什么%.c在那里? 為什么那里有-c標志? 什么是$

%開頭的規則是與指定模式匹配的模式規則 %%.c將取代之前任何出現.o目標(邊注:此規則看起來應該是%.cpp%.cc ,因為你使用g++-std=c++11 )。

-c是一個編譯器標志,它告訴編譯器只編譯而不是鏈接最終圖像,即創建一個目標文件。

$<是一個make 自動變量 ,用第一個先決條件替換。

在制作對象時不指定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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM