linux下的很多软件都是通过源码包发布的。 对于最终用户来说,虽然配置和编译相比二进制软件包来说比较麻烦,但它的可移植性要好很多。 软件开发者往往只需要发布相同的源代码包,不同的最终用户编译后即可正确运行。 这也非常符合 C 语言的设计理念,一次编写,到处编译,常见的二进制包,如 rpm 和 deb,软件开发者必须针对每个特定平台定制特殊的软件包。 这个可以通过rpm文件的后缀名看出来,比如ppc、sparc、i386等,这里就不做赘述了。 有很多说法。 其实源码安装软件远没有很多朋友想象的那么复杂。 我会在这里做一些尽可能详细的陈述。 如有错误,欢迎朋友出砖!
安装的具体步骤:
- $ tar zxvf XXXX.tar.gz (or tar jxvf XXXX.tar.bz2)
- $ cd XXXX
- $ ./configure
- $ make
- # make install
用于安装后清理临时文件
- $ make clean
卸载软件
- # make uninstall
解压:
有两个最常见的源包(www.mageym.com.tar.gz 或 XXXX.tar.bz2)。 实际上,这些源码包是由两个工具压缩的。 tar.gz 结尾的文件使用的工具是 tar 和 gunzip,tar.bz2 结尾的文件使用的工具是 tar 和 bzip2,原因是 tar 只能打包多个文件,没有压缩功能,而 gz和bz2正好相反,只能压缩单个文件文件,这样我们常见的源码包其实就是通过tar打包不同的源码文件,然后通过gunzip或者bzip2压缩发布。 当然,这两个步骤可以通过一个命令来实现:
- $ tar zcvf XXXX.tar.gz XXXX(or tar jcvf XXXX.tar.bz2 XXXX)
解压的相关命令如下:
- $ tar zxvf XXXX.tar.gz
- $ tar jxvf XXXX.tar.bz2
./configure:
解压完成后正式开始安装(另外,在开始configure前,如有需要请使用补丁工具给源码打上相应的补丁),首先跳转到源码解压目录,众所周知 , 开始configure前要仔细阅读源码 目录下的README或INSTALL文件,这里列出了很多安装注意事项,configure其实是一个脚本文件,在当前目录下输入“./configure”,shell就会运行 当前目录下的configure脚本,有一点要说明,在整个configure过程中,还没有进行编译,configure只是做编译相关的准备工作,主要是对你当前工作做一些依赖检查 平台,如编译器是否安装,链接器是否存在,如果检测过程没有错误,你是幸运的,configure脚本 将在当前目录下生成另一个文件 Makefile 用于下一次编译和链接。 当然configure支持它丰富的命令行参数,你可以输入“./configre –help”来获取具体信息,最常用的大概有:
- $ ./configure –prefix=/opt/XXX
用于设置软件的安装目录。
制作:
如果配置过程正确完成,则会在源目录中生成相应的 Makefile。 Makefile 仅包含一组文件依赖项以及编译和链接的相关步骤。 事实上,真正的编译和链接工作并不是由 make 完成的。 是的,make 只是一个通用工具。 一般来说,make会根据Makefile中的规则调用相应的编译器,编译所有依赖于当前软件的源代码,生成所有相关的目标文件,最后使用链接器生成最终的Executable程序:
- $ make
进行安装:
当以上两步都正确完成后,就意味着编译和链接过程已经完全完成,最后要做的就是将可执行程序安装到正确的位置。 在这一步,普通用户可能没有相关目录的操作权限,暂时切换到root是个不错的选择,“install”只是Makefile文件中的一个标签,“make install”表示make工具执行所有 Makefile文件中“install”标签下的相关操作,如果configure阶段没有使用“–prefix=/opt/XXX”指定应用程序的安装目录,那么应用程序一般会安装到/usr/ 默认为本地/bin。 如果 /usr/local/bin 已经存在于您的 PATH 中,则安装基本结束:
- #make install
make clean:
make uninstall:
这两个步骤只是安装的后续操作。 需要注意的是,“clean”和“uninstall”也是Makefile中对应的两个标签。 在执行这两个步骤时,Makefile 必须保留,并且“make clean”用于在编译和链接过程中清除一些临时文件。 “make uninstall”是卸载相关应用程序。 和make install类似,make卸载也需要切换到root才能执行,但是很多Makefile中都省略了“卸载”标签,小伙伴们。 我们可以在对应的Makefile中自行查找。
为什么?
这里我试着解释一下上述步骤存在的原因。 从C语言的角度来看,一个程序要想从源代码正确生成相关的可执行文件,以下几个部分是必不可少的:源文件、编译器、汇编器、链接器、依赖库,通过以上步骤,朋友们应该已经知道了 只有一步(make)来实际执行编译和链接操作。 其他步骤存在的原因是什么?
有一点是肯定的,我用C语言在我的电脑上写了一些自娱自乐的小程序,并没有使用“configure or make install”之类的命令。 最多我自己写一个Makefile来管理源文件。 依赖,但软件开发者不同,他必须考虑软件的可移植性,他开发的软件不能只在自己的电脑上运行,对吧? 不同的平台甚至可能有不同的硬件架构,这导致 Makefile 的不可移植性。 为了解决这个问题,开发者通常会使用autoconf等工具生成对应的configure脚本,configure脚本用来屏蔽对应的平台差异,从而正确生成Makefile文件,然后make完成编译和链接工作 根据configure的劳动成果(Makefile)。
至于“安装或清理或卸载”,只对应Makefile中的不同规则。 Makefile的详细信息,朋友们可以自行参考相关文档。
一个例子
以下是在我的PC上从源代码安装tar工具的过程,作为上述步骤的具体示例:
- [root@localhost ~]# head -n 1 /etc/issue
- CentOS release 5.4 (Final)
- [root@localhost ~]# uname -sr
- Linux 2.6.18-164.el5
- [root@localhost ~]# gcc –version
- gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)
- Copyright (C) 2006 Free Software Foundation, Inc.
这个是我的系统信息。
- [root@localhost tools]# pwd
- /root/tools
- [root@localhost tools]# ls
- tar-1.23.tar.bz2
- [root@localhost tools]# tar jxvf tar-1.23.tar.bz2
- ……
- [root@localhost tools]# ls
- tar-1.23 tar-1.23.tar.bz2
- [root@localhost tools]# cd tar-1.23
- [root@localhost tar-1.23]# ls
- ABOUT-NLS build-aux configure gnu Makefile.am po src
- acinclude.m4 ChangeLog configure.ac INSTALL Makefile.in README tests
- aclocal.m4 ChangeLog.1 COPYING lib Make.rules rmt THANKS
- AUTHORS config.h.in doc m4 NEWS scripts TODO
解压原文件包,可以发现其中包括了configure脚本和README文件。
- [root@localhost tar-1.23]# mkdir -v ~/tar
- mkdir: 已创建目录 “/root/tar”
- [root@localhost tar-1.23]# ./configure –prefix=/root/tar
- ……
- [root@localhost tar-1.23]# echo $?
- 0
建立软件安装目录,并configure,检查configure返回结果,为0代表运行成功.
- [root@localhost tar-1.23]# ls -F
- ABOUT-NLS ChangeLog.1 configure.ac m4/ po/ tests/
- acinclude.m4 config.h COPYING Makefile README THANKS
- aclocal.m4 config.h.in doc/ Makefile.am rmt/ TODO
- AUTHORS config.log gnu/ Makefile.in scripts/
- build-aux/ config.status* INSTALL Make.rules src/
- ChangeLog configure* lib/ NEWS stamp-h1
可以看到Makefile文件已经被成功建立.
- [root@localhost tar-1.23]# less Makefile | grep install:
- || { echo “ERROR: files left after uninstall:” ; \
- install: install-recursive
- uninstall: uninstall-recursive
在建立的Makefile中存在install和uninstall标号
- [root@localhost tar-1.23]#make
- ……
- [root@localhost tar-1.23]#echo &?
- 0
make成功
- [root@localhost tar-1.23]#make install
- ……
- [root@localhost tar-1.23]# ls /root/tar
- bin libexec sbin share
- [root@localhost tar]# cd /root/tar/bin
- [root@localhost bin]# ls
- tar
- [root@localhost bin]# ./tar –help
- ……
- [root@localhost tar-1.23]#echo &?
- 0
安装并简单测试成功
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!