我之前总结了gcc的用法,那么在实际工作中,每次用gcc会很麻烦,尤其是一些大型项目,有很多的目录结构,这个时候我们就需要编写Makefile文件,然后在实际工作中,用make来编译大型的项目,相信搞过Android开发的一定对make,make install,make clean不陌生,分别是编译,安装和清理,下面我就用一个例子来说明Makefile怎么编写,还是上一讲的三个文件
func1.c
func2.c
main.c
来看一个简单的Makefile
Makefile的基本规则:
目标:依赖文件
执行程序
注意,执行程序前面要用tab键
还有Makefile只会认第一个总的目标,其他都是配合的目标
这里我们的目标就是生成main,那么需要依赖func1.o func2.o main.o
gcc -o main func1.o func2.o main.o 就是执行程序
下面再分别写目标func1.o func2.o main.o
.PHONY:clean
clean:
rm -rf main func1.o func2.o main.o
这是一个伪目标,后面不跟依赖,目的只是执行后面的执行程序,当我们执行make clean时,就会执行rm命令,把生成的一些中间文件都删除掉
好了,我们执行make,执行make就会去寻找Makefile,跟进里面的配置来执行
然后我们来执行主程序
然后执行make clean
Makefile有一个好处,比如修改了其中某一个文件,重新make的时候,只会重新编译修改的文件,其他文件不会编译
比如我们什么都不改,再执行make
比如我们现在修改下main.c,再make
我们看到func1.c和func2.c没有被重新编译,这也是用make的好处
一个简单的Makefile就是这样,下面我们来说下变量,我们可以在Makefile中定义变量,看下面的Makefile文件
我们定义了一个变量,object,接下来所有用到依赖的地方都用这个变量替换
我们还可以把条件判断加进来
很简单,不多说了
再说两个变量
$@:代表目标文件
$^:代表所有的依赖
刚才的程序还可以这样改
我们注意到在执行make的时候,执行程序都会输出,如果不想看到输出,可以在执行程序前面加一个@ 符号
其实我们还可以定义install的伪目标,一般这个命令就是把生成的可执行文件,复制到/usr/local下
有的时候,我们的Makefile不是真正的编译文件,而是包含的另外一个文件,那么就会去寻找另外一个文件,再编译,我们看下android源码跟目标的Makefile
那么其实我们也可以这样做,我们把Makefile改名为android.mk,然后新建一个Makefile
其实Makefile的规则远远不止这些,我这只是总结了一些简单的,如果想了解更多的,大家去官网查即可
好了,Linux Makefile编写就总结到这里,如有问题,欢迎指正,谢谢。
Makefile之Linux内核模块的Makefile写法分析