linux中安装程序有两种方式,下载源码编译安装和利用已经编译好的RPM(yum)安装
1.编译源码和tarball
使用类似 gcc 的编译器来进行编译的过程并不简单,因为一套软件并不会仅有一支程序, 而是有一堆源程序文件。所以除了每个主程式与副程式均需要写上一笔编译过程的指令外,还需要写上最终的连结程序。
此时,make指令就显得比较重要了。当执行 make 时,make 会在当时的目录下搜寻 Makefile (or makefile) 这个文字档,而 Makefile 里面则记录了原始码如何编译的详细资讯! make 会自动的判别原始码是否经过变动了,而自动更新执行档,是相当好用的一个辅助工具
那 Makefile 怎么写? 通常软件开发商都会写一支侦测程序来侦测使用者的操作环境, 以及该操作环境是否有软件开发商所需要的其他功能,该侦测程式侦测完毕后,就会主动的建立这个 Makefile 的规则档案啦!通常这支侦测程序的文件名为 configure 或者是 config
具体过程如下图所示:
Tarball 是一个软体包,通常是*.tar.gz(gzip压缩), 或者*.tar.bzp2(bzip2)格式,解压后,里面通常包含有:
- 原始程序源码文件;
- 侦测程序文件 (可能是 configure 或 config 等档名);
- 本软件的简易说明与安装说明 (INSTALL 或 README)。
那么一个软体的 Tarball 是如何安装的呢?基本流程是这样的啦:
- 将 Tarball 由厂商的网页下载下来;
- 将 Tarball 解开,产生很多的原码文件;
- 开始以 gcc 进行原始码的编译 (会产生目标档 object files);
- 然后以 gcc 进行函式库、主、副程式的连结,以形成主要的 binary file;
- 将上述的 binary file 以及相关的设定档安装至自己的主机上面。
上面第 3, 4 步骤当中,我们可以透过 make 这个指令的功能来简化。
下面的程序时手动编译的过程,比较繁琐,如果想要重新编译的话,就要再从头到尾执行一遍,如果是大型程序的话就要累死个人啊
- # 1. 先进行目标档的编译,最终会有四个 *.o 的档名出现:
- [root@www ~]# gcc -c main.c
- [root@www ~]# gcc -c haha.c
- [root@www ~]# gcc -c sin_value.c
- [root@www ~]# gcc -c cos_value.c
- # 2. 再进行连结成为执行档,并加入 libm 的数学函式,以产生 main 执行档:
- [root@www ~]# gcc -o main main.o haha.o sin_value.o cos_value.o \
- > -lm -L/usr/lib -L/lib
- # 3. 本程式的执行结果,必须输入姓名、360 度角的角度值来计算:
- [root@www ~]# ./main
- Please input your name: VBird <==这里先输入名字
- Please enter the degree angle (ex> 90): 30 <==输入以 360 度角为主的角度
- Hi, Dear VBird, nice to meet you. <==这三行为输出的结果喔!
- The Sin is: 0.50
- The Cos is: 0.87
make命令可以简化这个过程。
- # 1. 先编辑 makefile 这个规则档,内容只要作出 main 这个执行档
- [root@www ~]# vim makefile
- main: main.o haha.o sin_value.o cos_value.o
- gcc -o main main.o haha.o sin_value.o cos_value.o -lm
- # 注意:第二行的 gcc 之前是 <tab> 按键产生的空格喔!
- # 2. 尝试使用 makefile 制订的规则进行编译的行为:
- [root@www ~]# rm -f main *.o <==先将之前的目标档去除
- [root@www ~]# make
- cc -c -o main.o main.c
- cc -c -o haha.o haha.c
- cc -c -o sin_value.o sin_value.c
- cc -c -o cos_value.o cos_value.c
- gcc -o main main.o haha.o sin_value.o cos_value.o -lm
- # 此时 make 会去读取 makefile 的内容,并根据内容直接去给他编译相关的档案啰!
- # 3. 在不删除任何档案的情况下,重新执行一次编译的动作:
- [root@www ~]# make
- make: `main' is up to date.
- # 看到了吧!是否很方便呢!只会进行更新 (update) 的动作而已。
make 有这些好处:
- 简化编译时所需要下达的指令;
- 若在编译完成之后,修改了某个原码档案,则 make 仅会针对被修改了的档案进行编译,其他的 object file 不会被更动;
- 最后可以依照相依性来更新 (update) 执行档。
2.执行make命令需要makefile,makefile的语法规则:
- [root@www ~]# vi makefile
- LIBS = -lm
- OBJS = main.o haha.o sin_value.o cos_value.o
- main: ${OBJS}
- gcc -o main ${OBJS} ${LIBS}
- clean:
- rm -f main ${OBJS}
- 标的(target): 目标档1 目标档2
- <tab> gcc -o 欲建立的执行档 目标档1 目标档2
如下所示:
- # 1. 先编辑 makefile 来建立新的规则,此规则的标的名称为 clean :
- [root@www ~]# vi makefile
- main: main.o haha.o sin_value.o cos_value.o
- gcc -o main main.o haha.o sin_value.o cos_value.o -lm
- clean:
- rm -f main main.o haha.o sin_value.o cos_value.o
- # 2. 以新的标的 (clean) 测试看看执行 make 的结果:
- [root@www ~]# make clean <==就是这里!透过 make 以 clean 为标的
- rm -rf main main.o haha.o sin_value.o cos_value.o
其中make命令即make main(main可以省略)
makefile里面也可以使用变量功能,规则与shell变量略有不同:
- [root@www ~]# vi makefile
- LIBS = -lm
- OBJS = main.o haha.o sin_value.o cos_value.o
- main: ${OBJS}
- gcc -o main ${OBJS} ${LIBS}
- clean:
- rm -f main ${OBJS}
一般tarball的安装过程:
- ./configure
这个步骤就是在建立 Makefile 这个档案啰!通常程式开发者会写一支 scripts 来检查你的 Linux 系统、相关的软体属性等等,这个步骤相当的重要, 因为未来你的安装资讯都是这一步骤内完成的!另外,这个步骤的相关资讯应该要参考一下该目录下的 README 或 INSTALL 相关的档案!
一般来说 configure 设定参数较重要的就是那个 --prefix=/path 了,--prefix 后面接的路径就是‘这个软体未来要安装到那个目录去?’如果你没有指定 --prefix=/path 这个参数,通常预设参数就是 /usr/local 至于其他的参数意义就得要参考 ./configure --help 了 - make clean
make 会读取 Makefile 中关于 clean 的工作。这个步骤不一定会有,但是希望执行一下,因为他可以去除目标档案!因为谁也不确定原始码里面到底有没有包含上次编译过的目标档案 (*.o) 存在,所以当然还是清除一下比较妥当的。 至少等一下新编译出来的执行档我们可以确定是使用自己的机器所编译完成的嘛!
- make
make 会依据 Makefile 当中的预设工作进行编译的行为!编译的工作主要是进行 gcc 来将原始码编译成为可以被执行的 object files ,但是这些 object files 通常还需要一些函式库之类的 link 后,才能产生一个完整的执行档!使用 make 就是要将原始码编译成为可以被执行的可执行档,而这个可执行档会放置在目前所在的目录之下, 尚未被安装到预定安装的目录中;
- make install
通常这就是最后的安装步骤了,make 会依据 Makefile 这个档案里面关于 install 的项目,将上一个步骤所编译完成的资料给他安装到预定的目录中,就完成安装啦!
为了方便 Tarball 的管理,通常鸟哥会这样建议使用者:
- 最好将 tarball 的原始资料解压缩到 /usr/local/src 当中;
- 安装时,最好安装到 /usr/local 这个预设路径下;
- 考虑未来的反安装步骤,最好可以将每个软体单独的安装在 /usr/local 底下;
- 为安装到单独目录的软体之 man page 加入 man path 搜寻:
如果你安装的软体放置到 /usr/local/software/ ,那么 man page 搜寻的设定中,可能就得要在 /etc/man.config 内的 40~50 行左右处,写入如下的一行:MANPATH /usr/local/software/man
Tarball的更新可以利用diff和patch命令来完成(不过我觉得这个好像用不太到,用到再说吧)
3.函式库管理
依据函式库被使用的类型而分为两大类,分别是静态 (Static) 与动态 (Dynamic) 函式库两类。
静态函数库一般以libxxx.a命名,直接内置进程序中,程序编译成功后不再需要链接外部函数库,但升级不是很方便。
动态函数库一般以libxxx.so命名,链接进程序中,相对比较独立,方便升级,一般动态函数库比较流行。
如果我们将常用到的动态函式库先载入记忆体当中 (快取, cache),如此一来,当软体要取用动态函式库时,就不需要从头由硬碟里面读出啰! 这样不就可以增进动态函式库的读取速度?没错,是这样的!这个时候就需要 ldconfig 与 /etc/ld.so.conf 的协助了。
利用ldd命令可以查看程序链接的动态函数库。
4.md5sum / sha1sum
网上下载的源码一般都有用MD5或者sha1算法得到数字指纹,防止篡改。
md5sum / sha1sum命令就可以得到文件的MD5和SHA1码。