Linux系统中,源码安装软件包时./configure、make、make install的作用

一、程序的组成部分

Linux下程序大都是由以下几部分组成:

二进制文件:也就是可以运行的程序文件

库文件:就是通常我们见到的lib目录下的文件

配置文件:这个不必多说,都知道

帮助文档:通常是我们在Linux下用man命令查看的命令的文档

二、Linux下程序的存放目录

Linux程序的存放目录大致有三个地方:

/etc, /bin, /sbin, /lib  :系统启动就需要用到的程序,这些目录不能挂载额外的分区,必须在根文件系统的分区上

/usr/bin,/usr/sbin,/usr/lib:操作系统核心功能,可以单独分区

/usr/local/bin,/usr/local/sbin:/usr/local/lib:/usr/local/etc:/usr/local/man:这几个目录用于安装第三方程序,分别对应了二进制文件、库文件、配置文件、帮助文档的目录

通常来说源码安装程序时,就安装在 /usr/local目录下

三、编译安装源程序

1、使用如下命令查看当前系统是否安装了gcc编译器,没有可以先用yum安装gcc

gcc --version  #查看是否安装gcc

2、解压源码包,例如:

tar -xvf nginx-1.7.7.tar.gz #解压源码包

3、进入解压好的源码包:

cd nginx-1.7.7 #进入源码包

4、执行configure文件,此文件有两个功能:1、让用户选定编译特性;2、检查编译环境。configure执行后将生成MakeFile文件。例如:

./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf

其中我们通过--prefix制定了安装路径,通过--conf-path制定了配置文件的具体位置。注意:不是所有的程序的configure参数都是一样的 可以使用 ./configure --help查看详细参数说明。如果该程序所依赖的库在当前系统中没有安装,则会导致configure最后报错,遇到这种情况就需要你先安装依赖库。

5、执行make命令,编译程序

make

6、编译成功后就可以安装了,执行如下命令

make install

到此程序就算安装完成了,但是不要忘了还有后续的配置

四、配置程序

1、修改PATH环境变量,以能够识别此程序的二进制文件路径;

修改/etc/profile文件,在文件中 添加

export PATH=$PATH:/path/to/somewhere#记得是可执行文件所在的目录,路径中不要包含可执行文件。

然后执行 :

source /etc/profile    #使修改生效  

2、默认情况下,系统搜索库文件的路径/lib, /usr/lib; 要增添额外搜寻路径(注意:有的程序不提供库文件,那就不需要此设置了)

在/etc/ld.so.conf.d/中创建以.conf为后缀名的文件,而后把要增添的路径直接写至此文件中;然后执行如下命令使其生效

ldconfig

3、如果程序提供了库文件,也会相应的提供头文件,一般在安装目录的include目录下,系统默认扫描头文件的路径是:/usr/include。我们可以在/usr/include下用链接,链接到我们安装程序的头文件。

ln -s /usr/local/nginx/include  /usr/include/yourname

4、可能程序还提供了帮助文档,一般是安装目录下的man目录,为了我们可以使用man命令查看我们程序的帮助文档,我们需要:在/etc/man.config中添加一条MANPATH,指向我们的文档目录


configure/make/make install的作用

1、configure ,这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制

例如: ./configure --prefix=/usr

意思是将软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin), 资源文件就会安装在/usr/share(而不是默认的/usr/local/share), 同时一些软件的配置文件你可以通过指定 --sys-config= 参数,进行设定
有一些软件还可以加上 --with、--enable、--without、--disable 等参数对编译加以控制, 可以通过 ./configure --help 察看帮助详情

2、make 
这一步就是编译,大多数的源代码包都经过这一步进行编译 (当然有些perl或python编写的软件需要调用perl或python来进行编译)。 如果在make 过程中出现 error ,要记下错误代码(注意不仅仅是最后一行), 然后可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址), 或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。


make 的作用是开始进行源代码编译,以及一些功能的提供,

这些功能由他的 Makefile 设置文件提供相关的功能,比如 make install 一般表示进行安装,
make uninstal 是卸载,不加参数就是默认的进行源代码编译。

make 是 Linux 开发套件里面自动化编译的一个控制程序,
他通过借助 Makefile 里面编写的编译规范,进行自动化的调用 gcc 、ld 以及运行某些需要进行编译的程序。
一般情况下,他所使用的 Makefile 控制代码,由 configure 这个设置脚本根据给定的参数和系统环境生成。

 3、make insatll ,这条命令来进行安装(当然有些软件需要先运行 make check 或 make test
来进行一些测试),这一步一般需要有 root 权限,因为要向系统写入文件。

Q1: 
安装源码程序时,都要执行三步:
1 ./configure 
2 make 
3 make install
他们是什么?
configure要用到gcc或cc。
但make时,需要什么?


这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤。

./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本
make是用来编译的,它从Makefile中读取指令,然后编译。
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

AUTOMAKE和AUTOCONF是非常有用的用来发布C程序的东西。如果你也写程序想使用AUTOMAKE和AUTOCONF,可以参考CNGNU.ORG上的相关文章。

Q2:

cc和gcc又是什么?我在rh7.3用./configure时,它老说我没有cc,无法进行安装,怎么才能有cc

cc是gcc的连接.gcc是编译器.你安装的时候大概是没有选择开发工具.你自己到光盘上找一下gcc* 吧.装上就行了.

或者yum -y groupinstall "Development Tools" 自动安装基本开发工具

CC是makefile里用来定义编译器的,是为了方便代码移植而设定,因为不同的平台可能用到不同的编译器 
例如: 
x86 gcc 和 mips64 gcc-mips64 

当我们把x86下的代码移植到mips64时,只要将makefile里CC=gcc改成CC=gcc-mips64 

而不需要将所有出现gcc的地方都改成gcc-mips64

Linux CC与Linux GCC的区别概括介绍。从名字上看,老的unix系统的CC程序叫做C Compiler。但GCC这个名字按GNU的说法叫做Gnu Compiler Collection。因为gcc包含很多编译器(C, C++, Objective-C, Ada, Fortran,and  JAVA)。所以它们是不一样的,一个是一个古老的C编译器,一个是编译器的Gnu的编译器的集合(Gcc里的C编译器比CC强大太多了,所以你没必要用CC)。当你调用gcc时不一定是调用的C/C++编译器,是gcc根据文件扩展名自动识别并调用对应的编译器,具体可查阅$man gcc。

你是下载不到CC的,原因是:CC来自于昂贵的Unix系统,CC是商业软件,要想用你需要打电话,写订单,而不能直接下载。

linux下的cc是gcc的符号链接。可以通过ls –l /usr/bin/cc来简单察看.而编译时看到的控制台输出CC则是一个指向gcc的变量,该变量是make程序的内建变量,就算你在Makefile中没有CC= ,该变量也会存在,并默认指向gcc。cc的符号链接和变量存在的意义在于源码的移植性,可以方便的用GCC来编译老的用cc编译的unix软件,甚至连Makefile都不要改。而且也便于linux程序在unix下编译。

Q3:

make 和 make install 中的make是系统自带的命令还是可执行程序文件?。   make install中,是不是可以认为 install是make的参数?

install 不是make的参数,而是在makefile(Makefile)中有如:install:的语句。如果用make install,那么就执行install:后面的语句。

Q4:

Makefile是什么?有什么用?怎么用?

makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接-----但是不是所有的文件都需要重新编译,makefile能够纪录文件的信息,决定在链接的时候需要重新编译哪些文件! 

在unix系统下,makefile是与make命令配合使用的。

有了这个Makefile文件,不论我们什么时候修改了源程序当中的什么文件,我们只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件它连理都不想去理的。


你可能感兴趣的:(运维)