10分钟Linux-深入浅出编译安装

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云平台运维

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180703G1Y10G00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券