相关的有用的一些概念
tarball
将来一定要看看忘记密码 系统无法开机的情况
寻找一个安装程序的位置
whereis command
which command
程序安装之后,默认的帮助文档的位置好 /usr/share/doc
gcc
这一块的内容学习自鸟哥的西方才中文简体版,讲解tarball暗转软件中的某一个小节 要想自己通过tarball下载,然后编译安装开源软件,gcc的使用相当重要,gcc是GUN维护的Linux上面嘴边准的编译器
gcc -c hello.c
只是把源代码编译(-c(ompile)))目标文件 hello.o文件,但是并不会产生可运行的二进制文件。
gcc -O hello.c -c
在编译的时候,根据你的机器的特性编译出将来运行速度最优的objective 文件
**在连接生成可执行的binary文件时,将连接的函数库与相关的路径填入,形式如下**
gcc sin.c -lm -L/usr/lib -I/usr/include
这个命令经常出现在连接生成最终的可执行文件的时候,默认生成的是a.out可执行文件
-lm 值得是libm.so或者libm.a 这两个库函数文件。(上面的sin.c文件中调用了库函数)
-L 后面接的路径是刚刚上面函数库文件可能存在的位置,也就是gcc需要去搜索的目录
-I 后面接的是源代码中include所包含的头文件的位置
gcc -o hello hello.c
-o 后面跟的是要生成的可执行binary文件的文件名
gcc -o hello hello.o -Wall
-Wall 是的程序的编译连接变的更加完美,若果有非致命(fatal)的问题会议警告的形式现实出来
比较重要的大概就是这一些。另外,我们通常称 -Wall 或者 -O 这些非必要的参数为旗标 (FLAGS),因为我们使用的是 C 程序语言,所以有时候也会简称这些旗标为** CFLAGS** ,这些变量偶尔会被使用的喔!尤其是在后头会介绍的 make 相关的用法时。
使用make进行巨集编译
下载下来tarball文件解压之后,就得到了源文件,我们要对源文件编译得到我们要的可执行的文件。一个软件很明显应当有很多的源文件,如果都手动编译连接这将是一件非常繁艰巨的任务。这时就出现了make工具,配合make工具的是makefile文件,一般开源软件都带的有makefile文件。
先来看看make和makefile
举个简单的例子,在main路径下面写了一个写程序,主程序和子程序一共四个main.c haha.c sin_value.c cos_value.c如果我们一个一个变异然后再连接的话,将会很繁琐,如下:
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
于是makefile文件出现了,这个文件是中描述了一些规则,记录需要执行的步骤。如下:
[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
makefile的基本语法:
标的(target): 目标档1 目标档2
gcc -o 欲创建的运行档 目标档1 目标档2
那个标的 (target) 就是我们想要创建的资讯,而目标档就是具有相关性的 object files ,那创建运行档的语法就是以 按键开头的那一行!特别给他留意喔,『命令列必须要以 tab 按键作为开头』才行!他的守则基本上是这样的:
在 makefile 当中的 # 代表注解;
<tab> 需要在命令行 (例如 gcc 这个编译器命令) 的第一个字节;
标的 (target) 与相依文件(就是目标档)之间需以『:』隔开。
makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可啊!而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』
这样真实妙用无穷,有人感觉自己写一个shell scripts也能实现上面的操作,但是make的好处不仅仅是在这里,我们如果发现某一个子程序有问题的,当我们修改之后,再次make main的话,make会探测那些文件修改了,然后只针对那些做了改动的文件进行重新编译。
makefile 里面怎么重复的数据这么多啊!没错!所以我们可以再藉由 shell script 那时学到的『变量』来更简化 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}
与 bash shell script 的语法有点不太相同,变量的基本语法为:
- 变量与变量内容以『=』隔开,同时两边可以具有空格;
- 变量左边不可以有 ,例如上面范例的第一行 LIBS 左边不可以是 ;
- 变量与变量内容在『=』两边不能具有『:』;
- 在习惯上,变量最好是以『大写字母』为主;
- 运用变量时,以 ${变量} 或 $(变量) 使用;
- 在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
- 在命令列模式也可以给予变量。
由於 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里面去定义,更可以在命令列当中给予这个咚咚呢!例如:
[root@www ~]# CFLAGS="-Wall" make clean main
# 这个动作在上 make 进行编译时,会去取用 CFLAGS 的变量内容!
也可以这样:
[root@www ~]# vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
咦!我可以利用命令列进行环境变量的输入,也可以在文件内直接指定环境变量,那万一这个 CFLAGS 的内容在命令列与 makefile 里面并不相同时,以那个方式输入的为主?呵呵!问了个好问题啊! 环境变量取用的守则是这样的:
make 命令列后面加上的环境变量为优先;
makefile 里面指定的环境变量第二;
shell 原本具有的环境变量第三。
此外,还有一些特殊的变量需要了解的喔:
$@:代表目前的标的(target)
所以我也可以将 makefile 改成:
[root@www ~]# vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: ${OBJS}
gcc -o $@ ${OBJS} ${LIBS} <==那个 $@ 就是 main !
clean:
rm -f main ${OBJS}
tarball管理和建议
[tarball的管理和建议http://cn.linux.vbird.org/linux_basic/0520source_code_and_tarball_4.php
很明显这一块的内容和时代以及发行版本的关系很紧密。
使用原始码管理软件所需要的基础软件
- gcc 或 cc 等 C 语言编译器 (compiler)
- make 及 autoconfig 等软件
- 需要 Kernel 提供的 Library 以及相关的 Include 文件
只要顺著开发商提供的 README 与 INSTALL 文件所载明的步骤来进行,安装是很容易的。 但是关键的是发行商为了保证系统的安全,有可能没有安装gcc,make等工具,甚至有一些系统库都不存在,这个时候继续要自己安装,可以使用yum或者apt-get,视发型版本。下面是CentOS上安装这些系统工具的方法:
如果是要安装 gcc 等软件发展工具,请使用『 yum groupinstall "Development Tools" 』
若待安装的软件需要图形介面支持,一般还需要『 yum groupinstall "X Software Development" 』
若安装的软件较旧,可能需要『 yum groupinstall "Legacy Software Development" 』
tarball安装的基本步骤
- 取得原始档:将 tarball 文件在 /usr/local/src 目录下解压缩;
- 取得步骤流程:进入新创建的目录底下,去查阅 INSTALL 与 README 等相关文件内容 (很重要的步骤!);
- 相依属性软件安装:根据 INSTALL/README 的内容察看并安装好一些相依的软件 (非必要);
- 创建 makefile:以自动侦测程序 (configure 或 config) 侦测作业环境,并创建 Makefile 这个文件;
- 编译:以 make 这个程序并使用该目录下的 Makefile 做为他的参数配置档,来进行 make (编译或其他) 的动作;
- 安装:以 make 这个程序,并以 Makefile 这个参数配置档,依据 install 这个标的 (target) 的指定来安装到正确的路径!
注意到上面的第二个步骤,通常在每个软件在释出的时候,都会附上 INSTALL 或者是 README 这种档名的说明档,这些说明档请『确实详细的』 阅读过一遍,通常这些文件会记录这个软件的安装要求、软件的工作项目、 与软件的安装参数配置及技巧等,只要仔细的读完这些文件,基本上,要安装好 tarball 的文件,都不会有什么大问题罗。
我们底下约略提一下大部分的 tarball 软件之安装的命令下达方式:
- ./configure
这个步骤就是在创建 Makefile 这个文件罗!通常程序开发者会写一支 scripts 来检查你的 Linux 系统、相关的软件属性等等,这个步骤相当的重要, 因为未来你的安装资讯都是这一步骤内完成的!另外,这个步骤的相关资讯应该要参考一下该目录下的 README 或 INSTALL 相关的文件!
- make clean
make 会读取 Makefile 中关於 clean 的工作。这个步骤不一定会有,但是希望运行一下,因为他可以去除目标文件!因为谁也不确定原始码里面到底有没有包含上次编译过的目标文件 (*.o) 存在,所以当然还是清除一下比较妥当的。 至少等一下新编译出来的运行档我们可以确定是使用自己的机器所编译完成的嘛!
- make
make 会依据 Makefile 当中的默认工作进行编译的行为!编译的工作主要是进行 gcc 来将原始码编译成为可以被运行的 object files ,但是这些 object files 通常还需要一些函式库之类的 link 后,才能产生一个完整的运行档!使用 make 就是要将原始码编译成为可以被运行的可运行档,而这个可运行档会放置在目前所在的目录之下, 尚未被安装到预定安装的目录中;
- make install
通常这就是最后的安装步骤了,make 会依据 Makefile 这个文件里面关於 install 的项目,将上一个步骤所编译完成的数据给他安装到预定的目录中,就完成安装啦!
请注意,上面的步骤是一步一步来进行的,而其中只要一个步骤无法成功,那么后续的步骤就完全没有办法进行的
tarball 方式软件安装的建议 方便将来的删除和升级
通常我们会建议大家将自己安装的软件放置在 /usr/local 下,至於原始码 (Tarball)则建议放置在 /usr/local/src (src 为 source 的缩写)底下啊
让我们先来看一看 Linux distribution 默认的安装软件的路径会用到哪些?我们以 apache 这个软件来说明:
/etc/httpd
/usr/lib
/usr/bin
/usr/share/man
我们会发现软件的内容大致上是摆在 etc, lib, bin, man 等目录当中,分别代表『配置档、函式库、运行档、线上说明档』。 好了,那么你是以 tarball 来安装时呢?如果是放在默认的 /usr/local 里面,由於 /usr/local 原本就默认这几个目录了,所以你的数据就会被放在:
/usr/local/etc
/usr/local/bin
/usr/local/lib
/usr/local/man
但是如果你每个软件都选择在这个默认的路径下安装的话, 那么所有的软件的文件都将放置在这四个目录当中,因此,如果你都安装在这个目录下的话, 那么未来再想要升级或移除的时候,就会比较难以追查文件的来源罗! 而如果你在安装的时候选择的是单独的目录,例如我将 apache 安装在 /usr/local/apache 当中,那么你的文件目录就会变成:
/usr/local/apache/etc
/usr/local/apache/bin
/usr/local/apache/lib
/usr/local/apache/man
呵呵!单一软件的文件都在同一个目录之下,那么要移除该软件就简单的多了! 只要将该目录移除即可视为该软件已经被移除罗!以上面为例,我想要移除 apache 只要下达『rm -rf /usr/local/apache』 就算移除这个软件啦!当然罗,实际安装的时候还是得视该软件的 Makefile 里头的 install 资讯才能知道到底他的安装情况为何的。因为例如 sendmail 的安装就很麻烦......
这个方式虽然有利於软件的移除,但不晓得你有没有发现,我们在运行某些命令的时候,与该命令是否在 PATH 这个环境变量所记录的路径有关,以上面为例,我的 /usr/local/apache/bin 肯定是不在 PATH 里面的,所以运行 apache 的命令就得要利用绝对路径了,否则就得将这个 /usr/local/apache/bin 加入 PATH 里面。另外,那个 /usr/local/apache/man 也需要加入 man page 搜寻的路径当中啊!
由於 Tarball 在升级与安装上面具有这些特色,亦即 Tarball 在反安装上面具有比较高的难度 (如果你没有好好规划的话~),所以,为了方便 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
这样才可以使用 man 来查询该软件的线上文件罗!
鸟哥还举了一个安装网络校时服务器的软件的例子
需要注意的就是
[root@www ntp*]# ./configure --help | more <==查询可用的参数有哪些
--prefix=PREFIX install architecture-independent files in PREFIX
--enable-all-clocks + include all suitable non-PARSE clocks:
--enable-parse-clocks - include all suitable PARSE clocks:
# 上面列出的是比较重要的,或者是你可能需要的参数功能!
[root@www ntp*]# ./configure --prefix=/usr/local/ntp --enable-all-clocks --enable-parse-clocks <==开始创建makefile
[root@www ntp*]# make clean; make
[root@www ntp*]# make check
[root@www ntp*]# make install
patch,升级软件
升级的内容,回头咱看。先把上面的搞定。还有具体在Debian下面设置PATH和manpath路径的方法好好看看