魏蓝

以梦为马

导航

源码编译安装软件

1.对于c语言的源代码,我们要编译成二进制,并且安装上,只需要三步:

第一步:./configure

  (1) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefile.in文 件生成Makefile

  (2) 检查依赖到的外部环境,如依赖的软件包

第二步:make 根据Makefile文件,会检测依赖的环境,进行构建应用程序

第三步:make install 复制文件到相应路径

注意:安装前可以通过查看README,INSTALL获取帮助

 

 

2.1)第一步详解:configure实际上是一个脚本,官方一般都会提供一个脚本给你,就是源码给你下载完它会把在打包文件的根目录下,你解包以后,你会看到一个configure脚本,这个脚本是官方给你的,你不用去像之前说的gcc一步一步编译了,这个脚本,它有两个主要功能,第一,这个脚本,它后面允许你添加安装时候它们一些信息,比如说,你将来编译安装完了以后,你希望把这个软件安装在哪。这个源码编译之所以用源码编译,原因有好几个,其中有一个关键原因就是:用源码编译它更加灵活。你用yum也好,rpm安装包也好,安装的这个软件,所在的路径,是我们改不了的,装哪,官方做安装包提前做好了。我们用yum装上了,装哪了,我们顶多去看一看改不了。源码编译的好处就是:你将来在configure这个脚本执行的时候,你可以指定将来装到哪。那装在哪带来的好处就是,你装一个路径,指定一个文件夹,你可把所有这个相关的文件放在一个文件夹里面。这个好处就在于将来想删的话,很简单,你把这个文件夹一删,全没了。而yum安装的时候,哪些不同类型的文件一般它是按一定类别分别放在不同文件夹里,你手工删是删不干净的有可能,你要么用rm或者yum的remove这种命令来删。而用编译安装,它的安装路径是可以指定的,所以我们只要知道它的安装路径,就可以用rm把他删了。所以这样的话,安装路径是很灵活的,你希望装在哪,你可以自己定义,而我们可以把源码编译的过程想象成私人定制。

而rpm的这种方式因为别人替你编译完了的,所以这个编译的过程,你控制不了,那这时候可能会产生一个问题:

比如nginx,假设它有100个功能,实际上我们并不是100个功能都需要,那么我们在编译的时候,假设我们要30个,我们就可以定义30个。但是,如果你用的是yum安装,那没得选,人家选几个你用几个,比方说,人家编译的时候,选了60个,实际上你只需要30个,那多出来的,就白白编译了,浪费了。反而你需要的东西还可能恰恰没有。而我们自己编译,那就是想用几个,可以人为定义,我想用30个,我选30个就行了。

第一步很关键:第一步就是指定安装路径以及启用的功能,假设nginx有100个功能,你要启用30个,你要在这儿一个一个指,所以configure写都时候,这个代码会比较长一些。因为你要把30个特性一个一个写上。

当然执行这个命令的时候,它顺便还会做一件事:它还会检查你的编译过程所依赖的文件是否都存在,因为我们在编译安装的时候,它的这个每个特性,可能是依赖某个包的,你如果缺一些包,它就会报错。所以有时候你执行这个命令报错,那就说明你缺一些文件,你把这些文件的包,你给它装上就行了。

这步完成之后,他会在你的源码路径下生成一个Makefile文件,这是它的目标,这个Makefile文件就记录了你的安装路径和特性,所以这个脚本的功能就是生成一个Makefile文件。

当然有些小软件,太过简单,简单到这个脚本根本没提供,他直接就给你提供了一个Makefile文件,所以如果在这种情况下,那你就不用执行configrue了,因为configure的目标就是为了生成Makefile文件,当然你还可能不想用它的默认路径,你可以直接打开Makefile改改就行。

2)第二步:执行make的时候,它会自动地调用Makefile文件里面定义的这些信息,然后进行编译,这个过程是自动的。这个make命令,它会调用Makefile文件,来检查你的依赖环境,并且编译成二进制。但是编译生成二进制以后,它并不会安装。

3)第三步:make install 就是把你生成的二进制文件按照第一步指定的路径把那些文件复制到第一步指定的路径下,那就完成了最终安装。

 

 

2.范例:编译安装tree

1)下载源码:

wget ftp://mama.indstate.edu/linux/tree/tree-1.8.0.tgz

tgz就是tar.gz的简写。

2)解包

一般习惯性把源码放到/usr/local/src中

 

 3)ls进到这个路径查看:

 

 4)一定要进入到这个目录下:

 

 5)因为这个命令过于简单,没有提供configure,而是直接给了一个Makefile。

其中prefix就是安装路径将其改为/apps/tree

vim Makefile

 

 6)修改源码的版本号(娱乐)

#sed -i 's#v1\.8\.0#v8.8.8#' tree.c

7)安装gcc

 

 8)make和make install

 

 

 

 9)查看安装目录下有没有:

 

 现在这个命令就可以用了,当然这个路径,因为现在还没有写PATH变量,只能手工的把路径写下:

 

 对比新tree和旧tree

现在如果不写路径就是用老的tree,我现在就想用新版本的tree,怎么办,一种方法是把老版本的tree卸了,但是卸了用新的tree还要写路径,要么你就生成一个PATH变量指向它,要么干脆就指向一个软链接,但是这个路径不能和老的tree的路径冲突。

 

查看$PATH路径:

[root@centos8 ~ 741]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

将其放在/usr/local/bin,设置一个软链接,优先级高于旧tree:

 

 怎么还是旧的?那是因为,我们曾经执行过旧的,这个目的呢,因为它被缓存下来了,可以用hash查看:

 

 缓存下来,它这个路径记得就是旧tree的,我们可以清除掉缓存:

 

 所以缓存都被清空了,这时候你再执行tree:

 

 这就是编译安装。

 

 

3.总结编译安装:首先,我们先解包,解包以后进到这个位置,因为我们已经有了一个Makefile文件了。所以就用不着再执行configure了,把Makefile文件稍微改了改,就指定安装路径,然后就执行make,但是make需要调用gcc,所以要提前装好,再执行make install 就可以了。编译安装过程就结束了。

 

4.编译安装cmatrix

#wget https://github.com/abishekvashok/cmatrix/releases/download/v2.0/cmatrix-v2.0-Butterscotch.tar
tar xvf cmatrix-v2.0-Butterscotch.tar

 

 

 

 

./configure --prefix=/apps/cmatrix
make && make install 
#echo 'PATH=/apps/cmatrix/bin:$PATH' > /etc/profile.d/cmatrix.sh
#. /etc/profile.d/cmatrix.sh
#cmatrix -a -b -C yellow

 

 

2022-2-9 23:50

 

posted on 2022-02-09 23:51  魏蓝  阅读(451)  评论(0编辑  收藏  举报