[英]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)
我已經在我的問題中添加了評論,但在這里它們是明確的:
$(TARGET): $(OBJ)
規則中為什么我應該/不應該只做$(TARGET): $(OBJ) $(DEPS)
? %.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.