开放源码的软件安装简介
1.1 什么是开放源码、编译器与可运行档
-
可运行档:二进制文件(binary program)
如何测试一个文件是否是binary:file命令
# file命令用于辨识文件类型 ### 如果是binary而且可运行的话,它会显示运行档类别ELF 64-bit LSB executable [liusongle@centos ~]$ file /bin/bash /bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=85e3da5a087950e7aaeb7893c056218a8874d2e5, stripped [liusongle@centos init.d]$ file /etc/init.d/network ### 一般的script,会显示出text executable之类的字样 network: Bourne-Again shell script, ASCII text executable
shell script 虽然也可以运行,但是其是利用shell(e.g. bash)这支程序的功能进行一些判断式,仍是呼叫一些已经编译好的二进制程序来运行。
-
编译器:将程序源码转译成机器看得懂的语言
-
开放源码:程序码,人类看的程序语言
1.2 什么是函式库
库函数:类似副程序的角色,可以被呼叫来运行的一段功能函数
1.3 什么是make与configure
因为一套软件并不会仅有一支程序,而是有一堆程序码文件。所以除了每个主程序与副程序均需要写上一笔编译过程的命令外,还需要写上最终的连结程序。这个过程非常的繁琐。
为了简化这个编译的过程,就可以使用make工具。
当运行make时,make会在当前的目录下搜寻Makefile(or makefile)这个文字档,而makefile这个文字档里面记录了原始码如何编译的详细资讯。make会自动判别原始码是否经过了变动,而自动升级运行档。
通常软件开发商都会写一支侦测程序来侦测使用者的作业环境,以及该环境是否有软件开发商所需要的其他功能,该侦测程序侦测完毕后,就会主动的创建这个makefile的守则文件。通常这支侦测程序的档名为configure或者config。
侦测程序会侦测的数据有:
-
是否有适合的编译器可以编译本软件的程序码
-
是否已经存在本软件需要的函式库,或其他需要的相依软件
-
操作系统平台是否适合本软件,包括Linux的核心版本
-
核心的表头定义档是否存在(驱动程序必须要的侦测)
由于不同的Linux发行版的函式库文件所放置的路径,或者是函式库的档名订定,或者是默认安装的编译器,以及核心的版本都不相同,所以在某个系统上编译出的程序,一般是没有办法直接拿到另一个系统上运行的。
1.4 什么是Tarball的软件
tarball文件就是将软件的所有原始码文先以tar打包,然后再以压缩技术来压缩,最常见的是以gzip来压缩,因为利用了tar与gzip的功能,所以tarball文件一般的扩展名就会写成*.tar.gz,或者简写为*.tgz。
利用tar打包,bzip压缩的tarball文件扩展名则一般为*.tar.bz2之类的。
Tarball包是一个软件包,将他解压缩之后,里面的文件通常会有:
- 原始程序码文件;
- 侦测程序文件(configure或者config)
- 本软件的简易说明与安装说明(INSTALL或README)
1.5 如何安装与升级软件
升级的方法可以分为两大类:
-
直接以源码透过编译来安装与升级
直接以 Tarball 在自己的机器上面进行侦测、编译、 安装与配置等等动作来升级
-
直接以编译好的binary program来安装与升级。
如果软件厂商能够针对不同的Linux发行版进先进行编译,然后将编译好的二进制释出话,就可以直接再自自己与之相同的Linux系统上直接运行。
- Redhat(Fedora/CentOS 系列)发展的RPM管理机制以及yum线上升级模式。
- Debian使用的dpkg软件管理机制与APT线上升级模式等等
summary
一个软件的tarball的安装流程
将tarball由厂商的网页下载下来
将tarball解开 tar -z/j xtvc -f 原始文档 -C 解压目录
-z : 以gzip形式解压或压缩 -j:以bzip形式解压或压缩
-x:解打包或解压缩
-c:创建打包文件
-t:查看打包文件的内容含有哪些档名
开始以gcc进行原始码的编译(产生目标档)
以gcc进行函式库、主、副程序的连结,以形成主要的binary file
将上述的binary file以及相关的配置档安装再自己的主机上面。
2.使用传统语言进行编译的简单范例
2.1 单一程序: 打印出hello world
[liusongle@centos Code]$ vim hello.c
[liusongle@centos Code]$ gcc hello.c
[liusongle@centos Code]$ ll hello.c a.out
-rwxrwxr-x. 1 liusongle liusongle 8400 Aug 3 10:30 a.out
-rw-rw-r--. 1 liusongle liusongle 60 Aug 3 10:30 hello.c
[liusongle@centos Code]$ ./a.out
hello world
默认情况下,如果直接以gcc编译源码,并且没有加上任何参数,则运行的档名会被自动配置为a.out。
[liusongle@centos Code]$ gcc -c hello.c
[liusongle@centos Code]$ ll hello*
-rw-rw-r--. 1 liusongle liusongle 60 Aug 3 10:30 hello.c
-rw-rw-r--. 1 liusongle liusongle 1496 Aug 3 10:38 hello.o
2.2 主、副程序连接: 副程序的编译
[liusongle@centos Code]$ gcc -c thanks.c thanks_2.c
[liusongle@centos Code]$ ll thanks*
-rw-rw-r--. 1 liusongle liusongle 69 Aug 3 10:46 thanks_2.c
-rw-rw-r--. 1 liusongle liusongle 1504 Aug 3 10:46 thanks_2.o
-rw-rw-r--. 1 liusongle liusongle 72 Aug 3 10:42 thanks.c
-rw-rw-r--. 1 liusongle liusongle 1560 Aug 3 10:46 thanks.o
[liusongle@centos Code]$ gcc -o thanks thanks.o thanks_2.o
[liusongle@centos Code]$ ll thanks*
-rwxrwxr-x. 1 liusongle liusongle 8464 Aug 3 10:46 thanks
-rw-rw-r--. 1 liusongle liusongle 69 Aug 3 10:46 thanks_2.c
-rw-rw-r--. 1 liusongle liusongle 1504 Aug 3 10:46 thanks_2.o
-rw-rw-r--. 1 liusongle liusongle 72 Aug 3 10:42 thanks.c
-rw-rw-r--. 1 liusongle liusongle 1560 Aug 3 10:46 thanks.o
[liusongle@centos Code]$ ./thanks
Hello World
thank you!
由于原始码文件有时并非仅只有一个文件,所以无法直接进行编译。这时候就需要先产生目标档,然后再以连接制作成为binary可运行档。如果有一天,你升级了 thanks_2.c 这个文件的内容,则你只要重新编译 thanks_2.c 来产生新的 thanks_2.o ,然后再以连结制作出新的 binary 可运行档即可!而不必重新编译其他没有更动过的原始码文件。
2.3 呼叫外部函式库:加入连结的函式库
#include <stdio.h>
int main(void)
{
float value;
value = sin ( 3.14 / 2 );
printf("%f\n",value);
}
# -l :加入某个函式库
# m:libm.so这个函式库,其中,lib与扩展名(.a或.so)不需要写
# -L后面接的路径请到/lib 或/usr/lib里面搜寻
gcc sin.c -lm -L/lib -L/usr/lib <==重点在 -lm
./a.out
2.4 gcc的简易用法
- gcc -c hello.c 将原始码编译成为目标档,并不制作连结等功能
- gcc -0 hello.c -c 在编译的时候,依据作业环境给予最佳化运行速度
- gcc sin.c -lm -L/usr/lib -I/usr/include 在进行 binary file 制作时,将连结的函式库与相关的路径填入
- gcc -o hello hello.c 将编译结果输出成某个特定档名
- gcc -o hello hello.c -Wall 编译的时候,输出较多的信息说明
补充:
C语言编译的完整过程:
预处理:删除注释、宏扩展、文件包含 -i
编译:使用内置编译器软件将 (.i) 临时文件转换为具有汇编级指令(低级代码)的汇编文件 (.s)
汇编:将汇编文件(.s)转化成机器可理解的代码(.o)
链接:将库文件与对象文件链接。
3.用make进行巨集编译
3.1 为什么要用make
编译的过程太繁琐,而且如果要重新编译,所有流程都得重新来一遍。
使用make,仅仅需要写出main需要的目标档,make会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连接的动作。此外,如果我们更动过某些原始码文件,则make也可以主动的判断哪一个原始码与相关的目标档文件有升级过,并仅升级该文件。
make的好处:
- 简化编译时所需要下达的命令;
- 若在编译完成之后,修改了某个原始码文件,则make仅会针对被修改了的文件进行编译,其它的目标档不会被改动;
- 最后依照相依性来升级运行档。
3.2 makefile的基本语法与变量
# target是命令执行后生成的目标,可以是ObjectFile,也可以是执行文件,还可以是一个标签(类似clean)
target: 目标档1 目标档2
<tab> gcc -o 欲创建的运行档 目标档1 目标档2
####################################################################################
在makefile中 # 代表注解
<tab>需要在命令行的第一个字节
e.g. <tab>gcc -o 欲创建的运行档 目标档1 目标档2
target与相依文件之间需要以 : 隔开
main:main.o haha.o xixi.o heihei.o
gcc -o main main.o haha.o xixi.o heihei.o
[liusongle@centos Code]$ make
cc -c -o main.o main.c
cc -c -o haha.o haha.c
cc -c -o xixi.o xixi.c
cc -c -o heihei.o heihei.c
gcc -o main main.o haha.o xixi.o heihei.o
两个以上的运行行动
main:main.o haha.o xixi.o heihei.o
gcc -o main main.o haha.o xixi.o heihei.o
clean:
rm -f main main.o haha.o xixi.o heihei.o
如此一来,我们的makefile就有两个target,分别是main与clean,如果我们要创建main的话,输入make main。如果要清除没的,输入make clean即可。如果想要先清除目标档再编译main这个程序的话,可以这样输入: make clean main。
[liusongle@centos Code]$ make clean
rm -f main main.o haha.o xixi.o heihei.o
[liusongle@centos Code]$ make main
cc -c -o main.o main.c
cc -c -o haha.o haha.c
cc -c -o xixi.o xixi.c
cc -c -o heihei.o heihei.c
gcc -o main main.o haha.o xixi.o heihei.o
[liusongle@centos Code]$ make clean main
rm -f main main.o haha.o xixi.o heihei.o
cc -c -o main.o main.c
cc -c -o haha.o haha.c
cc -c -o xixi.o xixi.c
cc -c -o heihei.o heihei.c
gcc -o main main.o haha.o xixi.o heihei.o
[liusongle@centos Code]$ ./main
this is mainhaha
xixi
heihei
环境变量的取用守则
- make 变量后加上的环境变量优先
- makefile里面指定的环境变量第二
- shell原本具有的环境变量第三
4. Tarball的管理与建议
4.1 使用原始码管理软件所需要的基础软件
- gcc或cc等C语言编译器
- make及autoconfig(侦测软件)等软件
- 需要Kernel提供的Library以及相关的Include文件
如果已经有网络可以连上Internet的话,可以使用yum的软件群组安装功能。
- 如果要安装gcc等软件发展工具:
yum groupinstall "Development Tools"
- 若待安装的软件需要图形界面支持,还需要
yum groupinstall "X Software Development"
- 若安装的软件较旧,可能需要
yum groupinstall "Legacy Software Development"
4.2 Tarball 安装的基本步骤
- 取得原始档:将tarball文件在/usr/local/src目录下解压缩;
- 取得步骤流程:进入新创建的目录底下,去查阅INSTALL与README等相关文件内容
- 相依属性软件安装:根据 INSTALL/README 的内容察看并安装好一些相依的软件 (非必要)
- 创建 makefile:以自动侦测程序 (configure 或 config) 侦测作业环境,并创建 Makefile 这个文件;
- 编译:以 make 这个程序并使用该目录下的 Makefile 做为他的参数配置档,来进行 make (编译或其他) 的动作;
- 安装:以 make 这个程序,并以 Makefile 这个参数配置档,依据 install 这个标的 (target) 的指定来安装到正确的路径!
大部分tarball软件之安装命令的下达方法:
1. ./configure 创建makefile文件
./configure --prefix "目标文件夹"
2. make clean
make 会读取 Makefile 中关於 clean 的工作。这个步骤不一定会有,但是希望运行一下,因为他可以去除目标文件!因为谁也不确定原始码里面到底有没有包含上次编译过的目标文件 (*.o) 存在,所以当然还是清除一下比较妥当的。 至少等一下新编译出来的运行档我们可以确定是使用自己的机器所编译完成的嘛!
3. make
make 会依据 Makefile 当中的默认工作进行编译的行为!编译的工作主要是进行 gcc 来将原始码编译成为可以被运行的 object files ,但是这些 object files 通常还需要一些函式库之类的 link 后,才能产生一个完整的运行档!使用 make 就是要将原始码编译成为可以被运行的可运行档,而这个可运行档会放置在目前所在的目录之下, 尚未被安装到预定安装的目录中;
4.make install
make会根据makefile这个文件里面关于install的项目,将上一个步骤所编译完成的数据给他安装到预定的目录中。
4.3 一般Tarball软件安装的建议事项
-
安装的时候最好将tarball的原始数据解压缩到/usr/local/src当中。
-
安装时,最好安装到/usr/local这个默认路径下。
-
考虑未来的反安装步骤,最好可以将每个软件单独的安装在/usr/local底下。
-
为安装到单独目录的软件的man page加入man path搜寻。
MANPATH /usr/local/software/man
4.4 一个简单的范例ntp(时间服务器)
-
下载tarball文件
wget https://archive.ntp.org/ntp4/ntp-4.2/ntp-4.2.8p17.tar.gz
-
解压缩下载的tarball,并参阅README/INSTALL 文件
tar -zxvf ntp-4.2.8p17.tar.gz -C /usr/local/src [root@centos src]# ls autoconf-2.69 nginx-1.16.1.tar.gz openssl-fips-2.0.10.tar.gz autoconf-2.69.tar.gz ntp-4.2.8p17 [root@centos ntp-4.2.8p17]# vim INSTALL
-
检查configure支持参数,并建置makefile守则档
[root@centos ntp-4.2.8p17]# ./configure --help | more `configure' configures ntp 4.2.8p17 to adapt to many kinds of systems. Usage: ./configure [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print `checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for `--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or `..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, `make install' will install all the files in `/usr/local/bin', `/usr/local/lib' etc. You can specify an installation prefix other than `/usr/local' using `--prefix', for instance `--prefix=$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --More-- # 建置makefile守则档 # --prefix指定这个软件要安装的目录 [root@centos ntp-4.2.8p17] # ./configure --prefix=/usr/local/ntp
-
开始编译与安装
[root@centos ntp-4.2.8p17] #make clean;make [root@centos ntp-4.2.8p17] #make check [root@centos ntp-4.2.8p17] #make install