我发现这make
对于大型项目很有用,尤其是对于 中描述的令人困惑的依赖关系Makefile
,并且还有助于工作流程。我还没有听说它对make
小型项目有什么好处。有吗?
答案1
许多其他人正在研究更复杂的 makefile 的细节以及随之而来的许多复杂性。我通常出于完全不同的原因使用 makefile:
我不想记住任何事情。
即使您的项目确实很无聊且简单,并且您没有“正确”使用 makefile:
all:
gcc main.c -o project
我不需要考虑它或以与更复杂的项目不同的方式对待它:
all:
gcc libA.c libB.c main.c -o project2
或者,如果我指定了标志(例如-O2
),我不需要记住它们是什么。
另外,如果您从一个简单的 makefile 开始,并且稍后需要合并/重构内容,则无需记住以不同的方式构建每个项目。
答案2
相对于什么?
假设您有一个程序,已拆分为两个文件,您将其命名为file1.c
和 file2.c
。您可以通过运行来编译程序
cc file1.c file2.c -o yourprogram
但这需要每次都重新编译这两个文件,即使只有一个文件发生了变化。您可以将编译步骤分解为
cc -c file1.c
cc -c file2.c
cc file1.o file2.o -o yourprogram
然后,当您编辑其中一个文件时,仅重新编译该文件(无论您更改了什么,都执行链接步骤)。但是如果你编辑一个文件怎么办?然后是另一个, 您忘记编辑了这两个文件,并且不小心只重新编译了一个文件?
此外,即使只有两个文件,也有大约 60 个字符的命令。打字很快就会变得乏味。好吧,当然,您可以将它们放入脚本中,但随后您每次都会重新编译。或者您可以编写一个非常奇特、复杂的脚本来检查哪些文件已被修改并仅进行必要的编译。你明白我要说什么了吗?
答案3
即使对于小型项目,控制依赖关系逻辑并实现自动化构建也很有帮助。我还用它来触发安装和卸载,所以它是重置阶段的主开关。
答案4
Makefile
我的非常小的项目的示例:getPixelColor
它的作用正如其名称所示,采用两个可选参数,即坐标。
我特别喜欢那里事物相互依赖的方式。
COORDS ?= 0 0
CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
LDLIBS := -lX11
RM := rm -f
BIN := getPixelColor
SRC := $(BIN).cpp
$(BIN): $(SRC)
$(CXX) $(CXXFLAGS) $(SRC) -o $(BIN) $(LDLIBS)
.PHONY: clean
clean:
$(RM) $(BIN)
.PHONY: run
run: $(BIN)
./$(BIN) $(COORDS)
正如您所看到的,它可以完成您需要的所有操作,而无需输入任何额外内容:
用法
您可以通过以下方式运行它:
清理旧的二进制文件:
make clean
编译一个新的二进制文件:
make
有两种方式运行可执行文件:
默认坐标 [0,0]
make run # equals COORDS='0 0'
任何给定的坐标
COORDS='5 6' make run
Makefile 有时非常有帮助。项目越大,效益就越大。但即使是我最小的 C++ 项目,正如您在示例中看到的那样,也可以为您省去很多麻烦。