Makefile
了解编程的人应该清楚,比如当我们用C语言写一个程序时一般都会选择在IDE(如Turbo C,Eclipse)上编写,就因为这些工具方便,提供语法检查,且只要执行一个build操作就可以将整个项目中的所有C文件都编译完成并生产最终的可执行文件。IDE的确是好东西,可以节省大把的用于管理工程的时间,但是它却扼杀了大多数人学习良好工程管理技能的机会。尤其是初学者更不要轻易地迷恋上某个IDE,因为一个越优秀的IDE隐藏了太多的工程管理细节,虽然用起来会觉得很爽,但是这个时候你已经远离了某些问题的本质。(当然,这并不是一个讲解编程的文章,但是一个好的运维必须要懂得编程思想)
但是如果在Linux中不借助这些IDE工具的话就需要手工编译,一个文件一个文件的执行gcc(Gcc编译器)命令,并将这些命令所生成的“.o”文件利用gcc命令最后连接成一个可执行文件。虽然修改了某些C文件后,只需将它们重新编译成“.o”就可以去连接了。但是当你修改了某个头文件后,就遇到了一个更大的麻烦,就是include它的C问及那都得重新编译。
但是现在因makefile而不同了,makefile就像针一样,将看似一堆堆的代码一个一个串连起来,穿成一条条理清晰的线。makefile的作用就是自动化编译,无论这个工程拥有多少个源代码文件。makefile定义了一系列的规则,来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个shell脚本一样,其中也可以执行操作系统的命令。
Makefile是当前Linux下绝大多数软件的工程管理工具,而且它几乎已经成为了一个事实上的标准。即便你不具备编写Makefile的技能,那也需要掌握make这个工具的使用方法。因为还有很大一部分你需要的、或者感兴趣的软件是采用源代码方式发行的。即便RPM、deb等软件打包方案在Linux世界已经大行起道,但是如果你要使用这些软件的最新版本,基本是脱离不了使用make这个工具通过源代码来创建它。即便哪些采用python、perl等解释语言开发的软件,绝大多数的情况也是利用makefile做为安装脚本的。
GNU make
实际上Makefile并不是这个工程管理工具的名称,但却是一种约定俗称的叫法。它是一类工程管理工具的工程描述文件的默认名称,这个文件名它不是唯一的。可以是Makefile,可以是makefile,甚至是GNUmakefile。Makefile是make工程管理工具的工程描述文件,make是类UNIX世界的一个传统工程管理工具,是它们文化的一部分,可以称作Makefile文化。既然是文化,自然就百花齐放了。在Linux中采用的是GNU make这一体系,属于GNU计划中的一部分,可以说是所有体系中功能最为丰富、兼容性最好的一个Makefile文件的传承品。Linux内核的编译时又两个强依赖,其中一个就是GNU make,另外一个就是gcc。
make就是Linux系统下的一个工具,在任意目录中执行make都可以,只是效果不同罢了。make会在执行路径中搜索makefile文件。当然如果同时又Makefile,makefile,GNUmakefile时会按照顺序执行,只要选中一个就不会再理会其他的了。
C/C++的项目管理工具Make将多个不同的源文件做成一个项目并且把这个项目的编译过程通过一个配置文件来提供Makefile。
makefile:定义了make(调用GCC或G++)按照何种次序去编译这些源程序文件中的源程序的(Make项目是源程序之外的管理程序而这个Makefile文件的生成是由一个automake工具生成的Makefile.in;autoconf工具生成的脚本文件configure;脚本文件提供给用户交互式可选择安装路径和特性在结合Makefile.in生成最终的Makefile文件)
make:根据Makefile的指示开展编译工作,利用Gcc将源码编译成为目标文件,这些目标文件通过函数库连接产生一个完整的可执行文件。
make install:将make所编译成的文件,也就是把配置文件,帮助文件,二进制文件,库文件展开到我们指定的对应路径下。
编译安装四步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 |
安装前配置编译环境 RHEL5:需要检查”Development Tools”和”Development Libraries”这两个包组是否安装,没有就需要YUM安装 RHEL6:需要检查”Development Tools”和”Compatibility Libraries”这两个包组是否安装,没有就需要YUM安装 tar:源文件都是归档压缩的需要解压 ./configure:根据脚本让用户指定安装特性和检测编译环境,以下是常用的编译选项。(具体编译选项还要根据--help查看) --help:由于每个软件生成的脚本文件格式不一样所以选项也不同查看帮助 --prefix=/PATH:基本通用的指定软件安装路径 --sysconfigdir=/PATH:基本通用的指定软件配置文件安装路径 --without-#####:忽略指定的这一个特性 make:根据makfile文件开始编译源文件生成二进制文件 -j:告诉make采用多任务的方式并行生成目标文件,现在是多核时代了。另外启动多任务模式比较吃内存。 make install:根据指定安装路径展开一系列文件 |
安装后配置二进制程序执行路径,库文件,头文件和帮助文件。就是把这些文件分别存放到Linux默认可以搜索到的路径下。
1) 路径:在/etc/profile添加PATH=$PATH:/path/to,或者在/etc/profile.d/目录下添加执行程序路径的脚本文件以.sh结尾。
2) 库文件:在/etc/ld.so.conf.d/目录下创建以.conf为后缀的文件,而后把要增加的库路径写入文件中。或者把库文件路径链接到/lib,/usr/lib也可以;ldconfig命令让系统重读库文件
3) 头文件:通过链接把头文件路径输出给系统默认识别路径/usr/include
4) Man文件:通过修改man配置文件/etc/man.conf中添加一条MANPATH指定man文件路径
案例:如编译安装Apache
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[root@localhost ~]# tar jxvf httpd-2.2.16.tar.bz2 -C /usr/local #解压缩 [root@localhost ~]# cd /usr/local/httpd-2.2.16 [root@localhost httpd-2.2.16]# ./configure -prefix=/usr/local/apache -sysconfigdir=/etc/httpd #配置Apache,如指定程序安装目录,指定配置文件安装目录 [root@localhost httpd-2.2.16]# make #开始编译 [root@localhost httpd-2.2.16]# make install #开始安装各种文件 [root@localhost ~]# echo "export PATH=$PATH:/usr/local/apache/bin" >> /etc/profile #配置二进制执行程序路径 [root@localhost ~]# touch /etc/ld.so.conf.d/http.conf [root@localhost ~]# echo "/usr/local/apache/lib" > /etc/ld.so.conf.d/http.conf #配置库文件路径 [root@localhost ~]# ln -sv /usr/local/apache/include /usr/include/httpd #配置头文件路径 [root@localhost ~]# echo “MANPATH /usr/local/apache/man”>> /etc/man.conf #配置帮助文件路径 |