在小型项目中使用`make`有什么好处?[关闭]


8

我已经看到这make对于大型项目很有用,尤其是在中描述了令人困惑的依赖关系时Makefile,还有助于工作流程。make对于小型项目,我还没有听说过任何优势。有吗


2
对增长感到乐观?:) 好习惯?这可能会误入舆论领域。
Jeff Schaller

输入make以发现答案。制作一个体面的模板Makefile,然后编辑其源文件变量。无需输入所有爵士乐。
user2497

对于大型项目来说,它们就像一场噩梦,所以说实话,我说它们对小型项目
有用

我可以使用makefile,但不能。我已将我最大的(个人)项目的源代码分为10个文件,重新编译了第一个文件,第一个文件包含其他9个文件的#includes。以重新编译的速度,对我而言,是否每次都重新编译都没有关系。
詹妮弗(Jennifer)

1
懒惰:-) make比大多数其他命令键入命令快得多,即使您没有创建智能的Makefile来干净地处理依赖关系也是如此:-)
Stephen Harris

Answers:


11

相对于什么?

假设您有一个程序,您已将其拆分为两个文件,它们被形象地命名为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个字符的命令。键入起来很快就很麻烦。好的,当然,您可以将它们放入脚本中,但是每次您都需要重新编译。或者,您可以编写一个非常复杂的脚本,以检查哪些文件已被修改,并且仅进行必要的编译。你知道我要去哪里吗?


对于非常小的项目,gcc -O3 -march=native -fwhole-program *.c 基本上可以进行编辑/编译/配置文件周期。但是您仍然希望有一个Makefile供其他人使用。能够使用-fwhole-program是将所有内容一起编译的一个有趣的优势,但是-flto通常可以为您提供几乎相同的优化。
Peter Cordes

2
一旦我开始将开关添加到编译器命令行(甚至对于一个源文件),我就会发现下一次记住它们变得很棘手。有时我会在源文件中添加注释,但在那一点上我应该只使用Makefile ...
Roger Lipscombe

@ger Lipscombe:如果您需要针对不同的环境进行编译,则就像在makefile中定义几个宏一样简单。加上一点创意,您可以将make命令挂接到一个编辑功能键,将输出捕获到文件中,然后使用另一个键将您置于任何错误的位置……
jamesqf

15

许多其他人正在研究更复杂的makefile的细节以及随之而来的许多复杂性。我通常使用makefile的原因完全不同:

我什么也不想记住

即使您的项目确实很无聊且简单,并且您也不“正确”使用makefile:

all:
    gcc main.c -o project

与一个更复杂的项目相比,我不需要考虑或对待它:

all:
    gcc libA.c libB.c main.c -o project2

或者,如果我指定了标志(例如-O2),则无需记住它们是什么。

另外,如果您从一个简单的makefile开始,并且以后需要合并/重构,则无需记住以不同的方式构建每个项目。


即使在未编译的项目中,我也使用makefile。我创建了“ phony”规则,这些规则运行仅与所涉及目录相关的复杂命令。例如:清理,安装到正确的位置,安装Docker映像。它只是使它更容易。
安东尼

5

即使是小型项目,将依赖性逻辑置于控制之下并自动构建也会很有帮助。我还使用它来触发安装和卸载,因此这是重置阶段的主要开关。


3

如果从2个源(.c文件)链接应用程序,则无需重新编译每个文件,如果使用make,则只需重新编译一个文件。

另外,我将举一个BSD世界的例子。它们具有基于系统的Makefile的框架。它们为您提供了系统目录的路径,并具有安装软件和手册页的目标。

例如,您刚刚beer.c为其编写了应用程序和手册beer.6。您创建Makefile

PROG=   beer
MAN=    beer.6

.include <bsd.prog.mk>

..并致电make install。它会自动将您的应用程序/usr/bin编译并安装到其上,并将手册页编译并安装到man可以找到它的地方。您只需使用一个简单的命令就安装了应用程序!

对于任何熟悉BSD的人来说,非常方便且绝对透明。比手动脚本好得多。


1

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 ++项目,如您在示例中所看到的,也可以省去很多麻烦。


0

make非常可靠地可用。如果您使用分发项目makefile,则用户将获得有关如何以与您相同的方式完成任务的简单参考。该makefile可不仅仅是为了编译以上。

以一个不需要编译的项目为例。我记得在一个Python项目上工作,该项目有一个make命令清除所有.pyc文件,一个make命令运行测试,一个从开发服务器下载静态数据的副本,等等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.