编译安装软件包之Apache

到达咱们的源代码安装了。源代码安装没有rpm安装的快捷。但比rpm灵活。如咱们自定义编译参数,能够最大化的贴近咱们想要的功能,性能好。并且咱们能看到源代码,安装的整个过程都很清楚,这就比rpm安全。源代码安装的程序通常都会放在同一个目录中,这样迁移也很方便,把所依赖的库和程序移走就能够。由于没有rpm数据库和安装的固定路径,因此能够多版本并存。更有趣的是由于能够自定义安装位置,因此普通用户也能够安装程序,如在本身的家目录中。python


目录:linux

1、简介程序员

2、安装
数据库


环境:编程

系统:CentOS7.1vim

gcc: 4.8.3缓存


1、简介安全

这里主要说的是关于C代码的编译安装,其实也说不了什么东西,简单的编译安装只有三步,而指定参数的部分,不一样的软件还都不同。这一部分主要是零散的一些东西。
bash

C代码编译安装三步:架构

./configure
make
make install

这部分由于知识面的欠缺,实在是组织不起来,是一些上课的笔记和本身的理解。


标准的程序安装要下面这么多的步骤,不过咱们不用本身手动执行:

源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 连接 --> 执行


库是一种功能的实现,调用它就能够直接使用这个功能:

库是可执行程序,但自己不能做为程序执行入口,只能被调用。

wKioL1Z-S1OCLKrXAACB0SWplfg120.jpg

如这个图片,程序只要调用API(在这里就是库),库这个程序可能会发起系统调用也可能只是某一种简单的功能,完毕之后把结果给程序,程序拿着结果再接着执行。 固然啦,有的程序也多是直接调用系统调用的,因此才画了两条直接到系统的线。


其中程序安装过程当中的连接就是把库和程序作关联,而使程序真正的能够工做起来。
静态连接:把库编译到到程序中。
动态连接:dll, so(shared object)  。

linux上面在编译程序的时候由ld程序在管理库的查找和加载。在程序安装完成之后,则须要ld-linux-x86-64.so.2来管理(CentOS7)。

若是把ld移走:

[root@localhost httpd-2.2.31]# ./configure
.....
configure: error: in `/root/httpd-2.2.31':
configure: error: C compiler cannot create executables
See `config.log' for more details
[root@localhost httpd-2.2.31]#


若是把ld-linux-x86-64.so.2移走:

[root@localhost ~]# fdisk
-bash: /usr/sbin/fdisk: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
[root@localhost ~]# ls
-bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
[root@localhost ~]# wc 
-bash: /usr/bin/wc: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

这个可不要轻易尝试,除了内嵌命令,都不能运行了。甚至都不能登陆了。玩大了,救援了j_0016.gif


API: Application Programing Interface   应用编程接口,也就是库的调用接口。
ABI: Application Binary Interface  应用二进制接口,这个就属于低层的运行方式。

API兼容,意味着开发库兼容, 所以,源代码可跨平台

ABI兼容,编译后的程序能够跨平台。


库调用: 开发调用,运行调用。

开发调用(API),是根据头文件来设置函数的各类参数,参数又是怎么传递的。函数就是库的接口。从而来调用库的各类功能。

由于各个系统有通用的API接口,这也就实现了源代码的跨平台。固然有的程序不仅是只调用API,也有可能调用系统调用。而这个的跨平台取决于系统接口的一致性。如POSIX标准。


POSIX: 可移植操做系统接口(Portable Operating System Interface)

此标准用来定义操做系统的接口规范(系统调用接口),以实如今不一样的操做系统上只要从新编译程序就能够运行。但如今只是实现了一部分的调用接口。因此有些代码仍是不能直接跨平台的。


以上都是在编译以前的,若是是想在编译以后的跨平台,那就取决于ABI了。
运行调用(ABI),是直接调用库的二进制程序。 不一样的CPU架构,不一样的操做系统,所组织 的二进制方式也不同。 ABI的不一样。如如下:
一、 OS平台:应用程序必须是特定OS平台所支持的版本。由于二进制的组织格式不同。
二、 硬件平台: 应用程序必须为特定的CPU所支持。由于CPU汇编指令集的不一样。
在这里二进制根本就没法展开运行。就算是CPU架构相同。系统的不一样,也会致使二进制的执行格式不一样,二进制的切入执行点都不对,固然没法执行,动都没法动,更别提调用库了。其实我也不是很清楚,朋友就当看故事吧。

程序编译会自动采用所在OS平台的库。 如 64的系统 64的库。
源代码翻译成二进制程序,其实就是翻译成了能够被当前CPU指令集所可以执行的二进制程序。

amd 64bit 和 intel 64bits 的CPU架构是相同的。指令集也是相同的。 都是x86系列。

2、安装

编译C源代码,前提是提供开发工具及开发环境

开发工具:gcc,make等。

开发环境:开发库,头文件。 如glibc标准库。

简单一点直接安装开发包组:yum groupinstall "Development Tools"

开发工具介绍,是由程序员来完成的,咱们这里的安装用不到。

autoconf: 生成configure脚本
automake:生成Makefile.in模板。

建议:安装前查看INSTALL,README


第一步:configure脚本
选项:指定安装位置、指定启用的特性
--help: 获取其支持使用的选项
选项分类:
安装路径设定:
        --prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/
        --sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;

Optional Features: 可选特性
        --disable-FEATURE
        --enable-FEATURE[=ARG]

Optional Packages: 可选包
        --with-PACKAGE[=ARG]
        --without-PACKAGE

第二步:make
第三步:make install


安装后的配置
(1) 导出二进制程序目录至PATH环境变量中;
编辑文件/etc/profile.d/NAME.sh
export PATH=/PATH/TO/BIN:$PATH

(2) 导出库文件路径
编辑/etc/ld.so.conf.d/NAME.conf,添加新的库文件所在目录至此文件中;并让系统从新生成缓存:ldconfig [-v]

(3) 导出头文件
基于连接的方式实现: ln -sv 

(4) 导出帮助手册
编辑/etc/man.config文件,添加一个MANPATH


安装httpd2.2


[root@localhost httpd-2.2.31]# ./configure --prefix=/usr/local/httpd2.2 --sysconfdir=/etc/httpd/

[root@localhost httpd- 2.2 . 31 ]# make && make install
来看看安装目录下的文件。
[root@localhost httpd2. 2 ]# ls
bin  build  cgi-bin  error  htdocs  icons   include   lib  logs  man  manual  modules

这里是咱们所指定的配置文件的位置。

[root@localhost httpd2. 2 ]# ll /etc/httpd
total  92
drwxr-xr-x.  2  root root   4096  Dec  27  02 : 28  extra
-rw-r--r--.  1  root root  13720  Dec  27  02 : 28  httpd.conf
-rw-r--r--.  1  root root  12958  Dec  27  02 : 28  magic
-rw-r--r--.  1  root root  53011  Dec  27  02 : 28  mime.types
drwxr-xr-x.  3  root root   4096  Dec  27  02 : 28  original
[root@localhost httpd2. 2 ]#

安装后配置

一、PATH变量

由于咱们自定义安装的位置没有在PATH变量中,这样咱们是不能直接执行所安装的软件的。由于咱们执行的命令除了内嵌和有别名的之外,都是bash查找PATH变量所指的路径下全部文件的方式来执行的。

只要在/etc/profild.d/目录下添加以.sh结尾的文件就能够了。

[root@localhost bin]# pwd
/usr/local/httpd2. 2 /bin
[root@localhost bin]# httpd
-bash: httpd: command not found


[root@localhost bin]# vim /etc/profile.d/httpd2.2.sh

export PATH=/usr/local/httpd2. 2 /bin:$PATH
[root@localhost bin]# . /etc/profile.d/httpd2. 2 .sh
 
[root@localhost bin]# httpd
httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain  for  ServerName
[root@localhost bin]# echo $PATH
/usr/local/httpd2. 2 /bin:/usr/local/python27/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

上面咱们能够看到,执行命令httpd是不起做用的,咱们编辑完/etc/profile.d/httpd2.2.sh之后而且读入之后就能够了。能够看到如今的PATH变量中已经有软件所在的路径了。

二、导出库文件的路径

在linux上面全部编译安装的软件,找库的方式都是基于ld程序的。

若是是安装在/lib[64]或者/usr/lib[64]下,那么ld默认可以找到,若是安装在其它的目录,则须要将其添加到/etc/ld.so.cache文件中。

ld程序在每次开机的时候,都会由/etc/ld.so.conf和/etc/ld.so.conf.d/*.conf文件来生成ld.so.cache文件。 因此咱们手动添加路径之后,要么重启主机,要么就用ldconfig命令来重建ld.so.cache文件。


ldconfig使用:

-v 显示过程。
-p 显示当前的缓存路径

[root@localhost httpd2. 2 ]# vim /etc/ld.so.conf.d/httpd2. 2 .conf
/usr/local/httpd2. 2 /lib
 
[root@localhost httpd- 2.2 . 31 ]# ldconfig -v | grep  '/usr/local/httpd2.2'
ldconfig: Can't stat /libx32: No such file or directory
ldconfig: Path `/usr/lib' given more than once
ldconfig: Path `/usr/lib64' given more than once
ldconfig: Can't stat /usr/libx32: No such file or directory
/usr/local/httpd2. 2 /lib:

我这里报了一堆错误,不过管它。看到最下面的/usr/local/httpd2.2/lib了吧,已经成功了。能够不加grep来看详细的信息。

这些操做不是为了所安装的httpd要使用的,而是之后安装其它的程序可能会被依赖

三、导出头文件:
基于连接的方式实现: ln -sv

[root@localhost httpd2. 2 ]# ln -s /usr/local/httpd2. 2 / include / /usr/ include /httpd2. 2
[root@localhost httpd2. 2 ]# ll /usr/ include /httpd2. 2 / -d
drwxr-xr-x.  2  root root  4096  Dec  27  02 : 28  /usr/ include /httpd2. 2 /

这里也不是为了所安装的httpd要使用的,而是之后安装的其它程序可能会使用。

四、导出帮助手册:

编辑/etc/man.config文件,添加一个MANPATH

呃,这里说一下,咱们这个CentOS7.1好像自动识别了。不用再配置了,直接man httpd就成功了。

那么这里也不用说什么,在CentOS6上面直接编辑/etc/man.config文件便可。


到这里就已经安装成功了。我这写的比较杂,东西也比较乱。但都是一些但愿之后能够帮助到本身的东西,也但愿能够帮助到朋友们。



小话题:

若是在咱们编译软件的时候,终端实然断了怎么办,按理论来讲,在此终端下的程序都会结束。编译了老半天,白忙活了。那么能够用screen程序。

screen 模拟多个虚拟窗口,而且隐藏之后能够退出终端。
screen 打开新的screen虚拟界面
隐藏:Ctrl+a,d是在按住ctrl的状况下,按一下a,再按一下d。
从新打开隐藏的 Screen: 显示各screen ID:  screen -ls
从新打开:screen -r Screen_ID
只有一个模拟窗口,直接用screen -r就能够打开。

Ctrl+a,d之后screen进程的父进程就会变成init。与本终端脱离父子关系。因此在终端结束之后编译也不会中断。
screen -r ID  打开之后,screen会在sshd-bash中开个新进程与父进程是init的screen通讯(本身瞎猜的)。


这个在编译内核的时候经常使用到,而编译软件看状况吧。

本文出自 “大蕃茄” 博客,请务必保留此出处http://fanqie.blog.51cto.com/9382669/1728628

相关文章
相关标签/搜索