在Linux中理解Makefile的指南
作为,大多数C/C++程序员通过运行GCC或者G ++编译器命令来编译在Linux命令行上的程序。
但是,由于他们的项目开始增长,通过单个命令的编译并不容易有效。
作为所有汇编相关问题的解决方案,我们需要了解Makefiles的概念。
本主题将在一系列文章中介绍,在第一个部分中,我们将讨论Makefiles在Linux中的基础知识。
单个命令方法问题
假设项目包含在目录中保存的以下三个文件:
test.c anotherTest.c test.h
作为,我们将再次运行以下命令,以编译项目:
gcc -Wall test.c anotherTest.c -o test -I.
只要项目包含几个文件,这很好。
现在假设,项目会增长,现在包含10个源和头文件。
那你会做什么?
许多人会争辩说他们将通过添加这些新文件的名称来扩展现有命令。
但是,如果你以某种方式松开这个命令或者切换到另一个系统怎么办?
你会再次键入long命令吗?
此外,假设项目生长为包含数百个文件的大项目,并且需要5-10分钟才能编译。
现在,假设我们其中一个文件中添加一个简单的Printf调试行,但使用单个命令重新编译。
对于一个程序需要10分钟才能编译,也不会效率低效,即使其中一个源文件中更改/添加了单行?
嗯,解决方案是使用makefiles。
makefiles.
makefile是一个特殊文件(仅为"makefile"),它包括目标,依赖关系和命令,以一种方式构造,使程序员能够编译程序。
在Layman的条款中,这里是Makefile的非常基本的语法:
target: dependencies command
因此,如果我们想为我们的示例项目创建一个非常基本的makefile(最后一节列出),那将是如下所示:
all: test test: test.o anotherTest.o gcc -Wall test.c anotherTest.c -o test -I. test.o: test.c gcc -Wall -c test.c -I. anotherTest.o: anothertest.c gcc -Wall -c anotherTest.c -I.
这可能看起来有点复杂于,但如果我们密切地观察,则只包含一组目标,依赖关系和命令。
- 目标'全部'只不过是默认的makefile目标。
- 目标'测试'取决于test.o和另一个.o,可以通过下面提到的命令制作。
- 同样,目标'test.o'和'另一个'均取决于它们对应的.c文件,可以通过它们下面提到的各个命令制作。
现在,一个人会问,如何使用这些目标?
嗯,这些是通过'make'命令使用的。
此命令接受目标作为参数,并查找名为"makefile"的文件以了解如何构建该目标。
例如,如果指定以下命令:
make test
然后,此命令将扫描makefile,构建(如果需要)测试的依赖项,然后执行命令以构建测试本身。
同样,如果要在每个编译循环之前删除所有非必需的对象或者可执行文件,则可以将目标添加到Makefile中。
这是一个例子:
all: test test: test.o anotherTest.o gcc -Wall test.c anotherTest.c -o test -I. test.o: test.c gcc -Wall -c test.c -I. anotherTest.o: anothertest.c gcc -Wall -c anotherTest.c -I. clean: rm -rf *o test
所以你可以刚发出以下命令:
make clean
要在开始编译周期之前清洁所有另外的对象文件和测试可执行文件。
此命令的美妙之处在于它知道自上次执行以来的文件已更改,并仅构建所需的依赖项。
因此,Make命令和Makefile的组合不仅使程序员能够汇编项目,而且可以最大限度地减少整体编译时间。