在大二的时候接触过Makefile,不过那时候没有把它当回事,想着现在不是有辣么多的IDE啦,学这个不是自找苦吃,所以就简单的看一下,敷衍了事,现在大三在老师的带领下系统的学习Linux后,发现当年好傻,接触的挺早的但是跟初学者一个样,哎呀,心好疼!!!下面我带大家深入的了解一下Gun Make及其基本用法。
首先我们先讲一下关于make 的理论知识,然后通过一个小例子实际操作一下。
在Linux中采用GUN make这一体系,属于GUN计划中的一部分,可以说是所有体系中功能最为丰富、兼容性最好的一个Makefile文化的传承品,linux内核编译时有两个强依赖,其中一个是GUN make,另一个是gcc。正所谓工欲善其事必先利其器,在我们学习Makefile之前首先我们了解一下make的基本用法。make就是linux系统下的一个工具,在任意目录中执行都可以,只是效果不同罢了。make会再执行路径中搜索Makefile文件,但是Makefile不是唯一的搜索对象,还可以是makefile或者GUNmakefile,如果一个路径中有他们三个的话,Make会选择其中一个,不过不要但心,make只会选择其中一个不会三个都选,那样不是会乱性了么,make的选择顺序是GUNmakefile,makefile,Makefile,只要选择其中一个,剩下的就不会理他了,现在觉得make是不是很专一了呢。当然如果你使用make -f +指定文件名称的话make就不是那么专一了呢
make的常用命令:
'make all' 其功能是编译所有目标,类似于make
‘make install’ 安装程序
'make uninstall' 卸载安装的程序
‘make check’ 检查编译出来的东西能不能用
‘make dist’ 把程序打包发布出去,一般是.tar.gz包
GUN提供了一系列的工具用于帮助开发人员收集系统配置信息并自动生成Makefile文件。这套工具包括GUN autoconf和GUN automake
GUN autoconf :
'autoconf ' 通过configure.ac文件生成configure可执行文件
'autoheader' 通过configure.ac文件生成config.h.in文件
‘autoscan’ 检查目录中的资源文件,并且生成configure.scan文件
'autoreconf '执行autoconf中的所有指令,即当你把congure.ac文件和Makefile.am文件全部写好后只要执行最高目录下执行这个命令即可
接下来我通过一个小的题目演示一下整个流程:
有一个工程的最高层目录test中有一个hello.c文件和include子目录。在include目录中有一个print.h文件,另一个print.c文件。
print.c文件:
print.h文件:
hello.c文件:
首先要在test目录下编写Makefile.am文件
SUBDIRS依赖文件夹的名称
bin_PROGRAMS生成可执行文件的名称
hello_SOURCE 依赖的文件名
hello.LDADD相当于c语言中include进来的库文件
接下来是在include目录下编写Makefile.am文件:
noinst_LIBRARIES生成一个临时的依赖文件供编译使用
libprint_a_SOURCES生成libprint.a文件所需要的文件,其中libprint_a中的_是Makefile的规则凡是非字符的统统用_代替
编写好这些文件后可以按着下面步骤执行了,在最高目录test下一次执行
1、autoscan,生成文件中有一个configure.scan文件,使用vim编辑并修改文件名为configure.ac,编好后内容如下:
2、在test目录下执行autoreconf,就把autoconf的所有命令全部执行完了。
3、这时候目录下已经生成了configure可执行文件,通过./confgure即可生成makefile文件
4、在test目录下执行automake,这时候目录下已经生成了所有的文件。打开Makefile文件发现里面有将近300行的代码,简直了都,一个print语句竟然有三百行的编译顺序代码,但是如果要自己写的话只要十几行而已,所以对于小项目来说掌握Makefile文件的编写,自己写非常简单的。
5、在test目录下执行make && make install目录下即可生成hello可执行文件。到此整个小作业即可完成,主要还是Makefile.am和confgure.ac(confgure.scan)的编写,也即是能否正常生成Makefile文件的关键
博主试着把print.c文件放在test下的另一个目录lib中但是一直编译失败,无法生成可执行文件,一直没有解决,希望大家不吝赐教谢谢哈!!!