我已经看到这make
对于大型项目很有用,尤其是在中描述了令人困惑的依赖关系时Makefile
,还有助于工作流程。make
对于小型项目,我还没有听说过任何优势。有吗
make
以发现答案。制作一个体面的模板Makefile,然后编辑其源文件变量。无需输入所有爵士乐。
make
比大多数其他命令键入命令快得多,即使您没有创建智能的Makefile来干净地处理依赖关系也是如此:-)
我已经看到这make
对于大型项目很有用,尤其是在中描述了令人困惑的依赖关系时Makefile
,还有助于工作流程。make
对于小型项目,我还没有听说过任何优势。有吗
make
以发现答案。制作一个体面的模板Makefile,然后编辑其源文件变量。无需输入所有爵士乐。
make
比大多数其他命令键入命令快得多,即使您没有创建智能的Makefile来干净地处理依赖关系也是如此:-)
Answers:
相对于什么?
假设您有一个程序,您已将其拆分为两个文件,它们被形象地命名为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
通常可以为您提供几乎相同的优化。
许多其他人正在研究更复杂的makefile的细节以及随之而来的许多复杂性。我通常使用makefile的原因完全不同:
即使您的项目确实很无聊且简单,并且您也不“正确”使用makefile:
all:
gcc main.c -o project
与一个更复杂的项目相比,我不需要考虑或对待它:
all:
gcc libA.c libB.c main.c -o project2
或者,如果我指定了标志(例如-O2
),则无需记住它们是什么。
另外,如果您从一个简单的makefile开始,并且以后需要合并/重构,则无需记住以不同的方式构建每个项目。
即使是小型项目,将依赖性逻辑置于控制之下并自动构建也会很有帮助。我还使用它来触发安装和卸载,因此这是重置阶段的主要开关。
如果从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的人来说,非常方便且绝对透明。比手动脚本好得多。
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 ++项目,如您在示例中所看到的,也可以省去很多麻烦。