浅析./configure、make、make install之间的关系

浏览次数:5136

写在前面:
可能我们都知道linux中安装软件方式的一种是:将源码sourcecode.tar.gz进行解压,然后输入./configure,接着make,最后make install,一个软件就安装完成了。但是为何要进行这几步操作?这几步操作的含义又是什么?


======================================割一下=======================================
本文涉及的组件包为:
automake
autoconf
libtool
gcc-c++
gcc/cc
glibc(依赖)
m4(依赖)
libaio(依赖)
zlib(依赖)

简单来说,用sudy运营环境做比方
./configure          就是设计部出了一张设计稿,根据客户需要,符合各种要求
make                   就是前端组做好了模板
make install        就是实施人员将模板上传至了后台,而且做了各种模板绑定,能真正看到实际展示效果

那么实际上呢:

1、configure,这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,例如安装Apache时:./configure --prefix=/opt/sudytech/apache2 意思是将该软件安装在 /opt/sudytech/apache2下面,执行文件就会安装在 /opt/sudytech/apache2/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /opt/sudytech/apache2/share(而不是默认的/usr/local/share)。同时一些软件的配置文件你可以通过指定 --sys-config= 参数进行设定。有一些软件还可以加上-with、-enable、-without、-disable 等等参数对编译加以控制(具体可以查看基础环境安装文档的参数),你可以通过 ./configure -help 察看详细的说明帮助。当configure执行的时候一般我们会发现console给我们这类的回复:
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for xxxxxxxx... no
checking for xxxxxxxx... yes
这是configure正在检测你的安装平台的目标特征。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,其实configure它本身就是个shell脚本。

2、make,这一步就是编译,既然configure已经生成了Makefile,那make就可以直接进行编译了。大多数的源代码包都经过这一步进行编译(当然有些perl或python编写的软件需要调用perl或python来进行编译)。如果在 make过程中出现error ,一般是你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。执行完之后,会发现sourcecode目录中多了一些编译产生的可执行文件及目标文件(object file,*.o)。

3、make insatll,这条命令来进行安装(当然有些软件需要先运行 make check 或 make test 来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)。通常会带来相应的一系列mkdir、cp、ln操作

======================================再割一下=======================================

其实除了这三条之外还有下面讲几个非常有用的骚操作

1、make clean:清除编译产生的可执行文件及目标文件(object file,*.o),也就是说make之后再来一条make clean就等于没有make过,这点在make出错时变得极为有用。

2、make distclean:这个就厉害了,它除了清除可执行文件和目标文件外,把configure所产生的Makefile也清除掉。运行过甚至相当于没有configure过。

3、make veryclean:veryclean是有多clean?其实和distclean一样clean。。

4、make uninstall:虽然不是每个sourcecode包都有这个功能,但是这个东西确实是挺好的,想想看当你一时脑热直接./configure、make、make install之后,都不知道程序装去哪儿了,这时候就可以用这个进行卸载(当然uninstall只能执行1次,并且sourcecode目录中要有当前安装对应的Makefile)。


======================================再再割一下?=======================================

1、通过将不同状态的sourcecode目录打包,会发现大小均不同(configure前后、make前后)。

2、make是个非常聪明的家伙,make中断了以后,他会从断点处继续执行(当然make clean一下是最好的选择)。

3、有些软件很难缠,明明装上了报错的程序依赖包,make还是会报错。那是因为你没有执行make clean,错误的Makefile其实已经正在生成了,仍然卡在报错的那个地方。

4、觉得make太慢?试试4线程的make吧,make -j4可以让你感受4倍cpu的畅快,但是同时并不是所有sourcecode都有多进程优化,而且make -j32、make -j64肯定不比make -j4快。(并且会报错)

5、make过之后的sourcecode目录就是这个服务器的绿色解压版目录,因为不管你怎么删安装目录,一个make install就都回来了