在大型项目开发中,通常有几十到上百个源文件,如果每次均手工键入gcc 命令进行编译的话,非常不方便,我们就思考,能不能用一个命令完成多个动作——这就是make的用处。
make工具通过makefile文件来完成并自动维护编译工作:我们可以用vi makefile
来创建makefile文件,通过makefile文件的内容告诉make要做什么。
默认情况下,GNU make工具在当前工作目录中寻找makefile时,它会尝试以下几个名称(按顺序排列):GNUmakefile、makefile 和 Makefile,不建议使用GNUmakefile,有些版本的make可能不承认这个名称。
我们也可以选择给makefile使用一个自己指定的名字,可以用’-f’或’–file’选项来指定makefile的名称:用参数’-f NAME’或’–file=NAME’告诉’make’读取文件NAME作为makefile。
一个简单的makefile格式如下:
TARGET ... : DEPENDENCY ...
COMMAND
注意:这里COMMAND前面一定是Tab,即使按了8次Space键视觉效果看起来一样也会报错(missing separator (did you mean TAB instead of 8 spaces?)。如果是复制代码再粘贴,也可能会出现这个问题,这就需要删掉代码里的空格重新输入Tab。
TARGET
目标体,通常是一个由程序生成的文件的名称;目标体可以是可执行文件或目标文件,也可以是一个要执行的动作的名称,例如伪目标“clean”。
DEPENDENCY
目标体所依赖的文件,它被用来作为输入来创建目标。 一个目标经常依赖于几个文件。
COMMAND
所创建的目标体需要运行的命令,是 "make "执行的一个动作。 一个command可以有一个以上的命令,可以在同一行,也可以在各自的行中。
举个例子,我们先写一个名为“hello.c”的程序
#include
int main()
{
printf("Hello World!\n");
return 0;
}
再使用vi makefile
命令创建一个名为makefile的新文件,按“i”进入编辑模式插入文本,输入下列代码(注意Tab! Tab! Tab! 的问题)
hello.o:hello.c
gcc -c hello.c -o hello.o
hello:hello.o
gcc hello.o -o hello
这里hello.o就是第一个目标体,hello.c是它依赖的文件(执行第一个命令需要的文件);
hello是第二个目标体,hello.o是它依赖的文件(执行第二个命令需要的文件)。
如果我们不加目标体,直接调用make,它会自动地执行第一个目标体,在这个例子里就是hello.o;要想让它执行第二个目标体,可以用“make+目标体”,在这个例子里就是make hello。
如果我们对上面那个makefile做出如下修改(调换第一和第二个目标体的位置)
hello:hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
我们会发现,调用make命令后仍然可以正常执行。
要想完成hello就必须依赖hello.o,根据make的“隐式规则”,执行hello时会自动的生成它的依赖文件hello.o,并且在使用该文件后不会将其删除,在当前目录下使用“ls”命令还可以查看到“hello.o”。
如果我们只想执行某个 *** 作而不生成文件可以使用“伪目标”。
例如
clean:
rm *.o temp
'rm’命令将在每次你说’make clean’时被执行,但是它永远不会创建一个名为’clean’的文件。
要想了解更多make的使用规则和用法,可以点击链接阅读
GNU_make
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)