对于小型项目使用“make”有什么优点?

对于小型项目使用“make”有什么优点?

我发现这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)

正如您所看到的,它可以完成您需要的所有操作,而无需输入任何额外内容:


用法

您可以通过以下方式运行它:

  1. 清理旧的二进制文件:

    make clean
    
  2. 编译一个新的二进制文件:

    make
    
  3. 有两种方式运行可执行文件:

    • 默认坐标 [0,0]

      make run     # equals COORDS='0 0'
      
    • 任何给定的坐标

      COORDS='5 6' make run
      

Makefile 有时非常有帮助。项目越大,效益就越大。但即使是我最小的 C++ 项目,正如您在示例中看到的那样,也可以为您省去很多麻烦。

相关内容