Linux的版本众多,不同版本的Linux间提供的链接库可能都不相同,即使链接库相同,不同平台的机器码也不一样,这样会造成软件的开发者,需要为不同的平台、不同链接库的Linux系统,提供数百份不同的版本。
为了解决这个问题,通常软件开发者选择将软件的源代码文件(Source Files)提供给用户。用户取得应用软件的源码文件后,只需要在自己Linux系统上重新编译一次,就可以产生能在该UNIX上执行的程序文件,这样将大幅减少Linux软件提供者的麻烦。
不同的软件在安装的过程中,步骤可能都不相同,但总不脱离下面几个步骤:
1
获取源代码
2
解压源代码
3
配置编译选项
4
编译
5
安装
01
获取源代码
有很多地方都提供源代码包,到底在什么地方获得,这取决于软件的特殊需要。通常可以由下面几个渠道取得:
许多源代码软件包可以有很多种下载方式,包括对RPM 和DEB 专门创建的包,也可以是预编译成为二进制格式的包,当然还有源代码方式。许多源代码会被压缩成为.tar 格式, 这是源代码包进行打包的最简单方式。这些文件通常以.tar.gz、.tgz、.tar.bz2 作为扩展名。
要下载源代码,可以使用图形界面的浏览器进行下载,也可以使用wget 工具进行下载。
命令语法
下载软件时wget 常用的选项说明:
选项
说明
-V, --version
显示wget 的版本后退出
-b, --background
启动后转入后台执行
-o, --output-file=FILE
把记录写到FILE 文件中
-a, --append-output=FILE
把记录追加到FILE 文件中
-i, --input-file=FILE
下载在FILE 文件中出现的URLs
-F, --force-html
把输入文件当作HTML 格式文件对待
-B, --base=URL
将URL 作为在-F -i 参数指定的文件中出现的相对链接的前缀
-t, --tries=NUMBER
设定最大尝试链接次数(0 表示无限制).
-c, --continue
接着下载没下载完的文件
-N, --timestamping
不要重新下载文件除非比本地文件新
-S, --server-response
打印服务器的回应
-T, --timeout=SECONDS
设定响应超时的秒数
-w, --wait=SECONDS
两次尝试之间间隔SECONDS 秒
--waitretry=SECONDS
在重新链接之间等待1...SECONDS 秒
--random-wait
在下载之间等待0...2*WAIT 秒
-P, --directory-prefix=PREFIX
将文件保存到目录 PREFIX/...
举个例子
要获取Apache的源代码,可以使用下面的wget 命令 :
#wget http://mirror.bit.edu.cn/apache//httpd/httpd-2.4.33.tar.gz
02
解压
下载的源代码文件通常是采用gzip(.tar.gz、.tgz)和bzip2(.tar.bz2)压缩的文件,要解压这些文件,通常需要使用tar 命令。bzip2 的压缩率比gzip 高,所以下载时如果有bz2,推荐下载bzip2 压缩的文件。
当然,真正的文件是什么压缩文件,还要用file 命令来确定最为准确。
命令语法
tar 参数 文件名
使用到的几参数,分别表示:
参数
说明
-z
用 gzip 对存档解压
-j
用 bzip2 对存档解压
-x
解压存档文件
-v
详细显示处理的文件
-f
指定存档文件或设备
举个例子
如果下载的是gzip 压缩的文件,则执行:
# tar -zxvf httpd-2.4.33.tar.gz
如果是bzip2 压缩的文件使用tar –jxvf 命令即可:
# tar -zxvf httpd-2.4.33.tar.bz2
如果下载的是zip(某些可以在linux 系统下编译的windows 软件)文件,可以使用unzip 命令来解压,例如:
# unzip httpd-2.4.33.zip
03
配置编译选项
在开始编译之前,必须先完成下面几项工作:
1
详细阅读文件。
2
准备编译所需的组件。
3
设置编译选项。
3.1
详细阅读文件
通常,在源代码目录中会有一个INSTALL 文件或README 文件,在文件中会写明安装该软件的前提条件和安装方法。各个软件的具体安装步骤和需求可能不同,我们这里只讨论多数情况。
1
README:通常提供软件的基本信息,像这个软件提供了什么功能、作者是谁,遇到问题可以向谁汇报。
2
INSTALL:这个文件则会指导你,如何安装这个软件。
3
ChangeLog或Changes:这份文件则是软件版本修改的记录,比如何时增加了哪项新功能、何时修正了错误。
3.2
准备编译所需的组件
某些软件在编译期间(Compile Time)或执行期间(Runtime)可能需要依赖其他的软件或链接库,如果有这样的情况,那你就得在开始编译前先确认Red Hat Enterprise Linux是否存有这些软件! 如果没有,就必须先安装这些所需的软件。
大部分软件的作者,会在软件源码提供的README或INSTALL文件中,告知需要准备哪些软件。
在多数情况下,要从源代码安装软件,至少需要以下几个软件包(当然还有它们的依赖软件包,如果没有安装,在安装时会有提示):
autoconf
automake
gcc
gcc-c++
其中autoconf 和automake 在配置编译选项时用来协助配置脚本配置编译选项(也就是我们这个步骤)。gcc 软件包(RPM 包)是C 语言的编译器,gcc-c++是C++语言的编译器。
3.3
设置编译选项
软件编译前,也必须要先设置好编译的选项(Compile Options),以便配置软件编译的环境、要启用哪些功能。
以往,这个工作需要丰富的软件开发经验,才能顺利配置编译的选项。现在,大部分软件源码中,都会提供由autoconf/automake产生的configure。通过configure这个Shell脚本(Shell Script),就可以轻松的设置编译选项的工作了!
执行configure时,可能需要提供额外的参数;不同软件提供的configure,需要配置的选项可能会不一样。
如果想要知道这个软件的configure需要配合哪些选项,可以执行./configure --help。
举个例子
如果确定automake、autoconf、gcc和gcc-c++4 个软件包已经安装,我们现在就可以执行配置脚本configure 来配置编译选项了:
#./configure --prefix=/usr/local/apache
其中的—prefix 用来指定编译好的二进制代码将安装到何处。
configure 脚本可以使用一些选项指定编译时的选项,在执行完成后,会根据执行的选项和系统的配置生成一个编译规则文件Makefile。
04
编译软件
完成编译前准备工作后,你就可以正式开始编译软件了!要编译软件最简单的方式,是通过make工具。
命令语法
make [-f MAKEFILE] [OPTIONS...] [TARGET...]
make执行时,会寻找目前目录中是否有Makefile这个配置文件,如果有,就以Makefile 中的设置值,作为make命令的参数;
如果找不到Makefile,make就会显示“make: *** No targets specified and no makefile found. Stop.”的信息,然后终止make的执行。
如果你的make配置文件不是叫做Makefile,那么请配合-f MAKEFILE参数,其中的MAKEFILE就是自定义的make配置文件名称。
每一个Makefile中,都会定义许多的TARGET,每一个TARGET则定义要在Shell执行的工作内容。Makefile的TARGET的格式如下:
TARGET: DEPENDENCE_TARGETS...
ACTIONS...
其中的ACTIONS就是make在Shell中执行的工作。
如果你要执行Makefile中某一个 TARGET,你可以在执行make时,配合TARGET参数指定;
如果没有特别指定TARGET,那么make就会以Makefile中第一个TARGET为默认值。
执行autoconf/automake提供的configure后,会自动产生源码目录中相关的Makefile文件。由autoconf/automake的configure所产生的Makefile,会提供以下几个常见的TARGET:
TARGET
说明
all
编译所有程序与链接库、产生所有 info 与 man 文件、...。all 通常是 configure 产生的 Makefile 中第一个 TARGET,也可说是默认值。
clean
清除上次编译的记录。
distclean
清除所有东西,包含 Makefile。执行 distclean 后,你必须重 新执行一次设置编译参数的动作,才能再进行编译。
install
安装所有程序、链接库、引入文件、文件、...。
uninstall
卸载所有程序、链接库、引入文件、文件、...。
举个例子
在配置好编译选项后,就可以使用make 命令来生成二进制文件了:
# make
执行make 命令后make 会根据Makefile 文件来生成目标文件。
05
安装
成功编译出软件的相关文件后,要怎么安装这个软件呢?
同样的,你可以使用make,配合install这个Makefile定义的TARGET,进行安装的动作:
举个例子
编译完成后,执行make install 命令来安装软件:
# make install
06
卸载软件
可以使用make安装软件,那可不可以卸载软件(Uninstall)?当然也可以,你只需使用uninstall这个TARGET即可,如果没有make uninstall,可以直接将安装的目录删除即可完成源码安装软件的卸载。
每天叫醒你的不是闹钟,而是姿势
关注我们
云运维联盟
专注Linux云平台运维
领取专属 10元无门槛券
私享最新 技术干货