我不明白我使用教程创建的这个生成文件的某些部分
I don't understand some parts of this makefile that I have created using a tutorial
下面是我按照教程中的步骤生成的生成文件
我只有两个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)
我在我的问题所在添加了评论,但在这里它们是明确的:
- 在
$(TARGET): $(OBJ)
规则中,为什么我应该/不应该只做$(TARGET): $(OBJ) $(DEPS)
- 你能更详细地解释一下
%.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)
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 一次从文件中读取多行而不读取部分行的方法
- 从文件中读取字符串并将其不同部分保存在C++中的不同变量中
- cpp 文件中的部分行最终出现在输出文件中 - 闹鬼的代码
- c++ makefile:只使用include目录中的部分头文件