原文:http://linoxide.com/how-tos/linux-make-command-examples/
###################################################
Linux中make工具的案例解析
make命令是Linux中使用最频繁的命令之一。它可以帮助管理员使用命令行就可以编译安装许多开源组件,程序员也可以通过使用它完成对大型复杂工程的管理。本文中,我们会通过几个实际的例子来说明make命令的用法。
make命令如何工作?
对于不了解的人来说,make命令会把目标作为命令行参数。其实,这些目标都指定在一个Makefile文件中,其包含了对于相应目标的对应动作。
当make命令被第一次执行时,它会浏览Makefile文件,寻找提供给它的第一个目标作为最终目标,然后读取目标的依赖。如果这些依赖也是目标,那么make命令会浏览这些目标所在的位置并构建依赖。一旦最终目标的依赖都已存在,那么接下来就会构建目标,结束命令。
现在,假设你修改了其中的一个源文件,再次执行make命令,它仅仅会编译那个源文件对应的对象文件,因此在编译最后可执行文件的过程中可以节省很多的时间。
案例
我的测试运行环境:
OS -> Ubuntu 14.04
Shell -> GNU bash(4.3.11)
Application -> GNU Make 3.81
##################################
工程的全部文件如下:
anotherTest.c:
#include "test.h" int main() { print_test(); return 0; }
#include "test.h" void print_test() { printf("print test!!!\n"); }
#ifndef TEST_H_ #define TEST_H_ #include <stdio.h> #include <stdlib.h> void print_test(); #endif
all:test test:test.o anotherTest.o gcc -Wall test.o anotherTest.o -o test test.o: test.c gcc -c -Wall test.c anotherTest.o:anotherTest.c gcc -c -Wall anotherTest.c clean: rm -rf *.o test
1.最简单的开始
编译这个工程,你不仅可以单单使用"make"命令,还可以将目标“all”作为make命令的参数:
从上面可以看出,make命令首先构建依赖,然后构建最终的目标。
现在,不仅生成了可执行文件(最终目标),还有.o文件(依赖)
简单修改test.c:
#include "test.h" void print_test() { printf("print test!!!\n"); printf("a little alter\n"); }
在此执行make命令:
此时你会发现,仅有修改过的test.c文件被重新编译
想要清楚所有生成的.o文件和可执行文件,只需要执行make clean命令即可:
2.强制每次均make所有目标
现在,你应该已经意识到make命令并不会重新编译没有修改过的文件。但如果你想要改变这个默认的行为,只需要在make命令后加上-B选项:
"make -B"命令会强制编译所有文件
3.打印调试信息
如果你想要了解make命令在执行时的详细信息,可以加上-d选项:
由于输出过于庞大,你可以使用more命令,这样就可以一页一页的浏览。
4.改变编译目录
如果你想要编译的工程并不在当前目录,使用-C选项可以改变make命令的执行路径:
当你使用-C选项指定了执行路径后,make命令就进入你指定的路径进行编译,它首先会寻找Makefile文件,如果找到,则继续,完成后退出,否则,直接退出:
5.将其他文件作为Makefile文件使用
有时后,你想要将Makefile改名为其他名字,并且想要make命令将改名后的文件想默认的"Makefile"文件一样对待,使用-f选项可以实现这一目标: