设为首页 收藏本站
查看: 690|回复: 0

[经验分享] 编译安装软件包之Apache

[复制链接]

尚未签到

发表于 2018-11-20 11:45:06 | 显示全部楼层 |阅读模式
  到达我们的源代码安装了。源代码安装没有rpm安装的快捷。但比rpm灵活。如我们自定义编译参数,可以最大化的贴近我们想要的功能,性能好。而且我们能看到源代码,安装的整个过程都很清楚,这就比rpm安全。源代码安装的程序一般都会放在同一个目录中,这样迁移也很方便,把所依赖的库和程序移走就可以。因为没有rpm数据库和安装的固定路径,所以可以多版本并存。更有趣的是因为可以自定义安装位置,所以普通用户也可以安装程序,如在自己的家目录中。
  目录:
  一、简介
  二、安装
  环境:
  系统:CentOS7.1
  gcc: 4.8.3
  一、简介
  这里主要说的是关于C代码的编译安装,其实也说不了什么东西,简单的编译安装只有三步,而指定参数的部分,不同的软件还都不一样。这一部分主要是零散的一些东西。
  C代码编译安装三步:
./configure  
make
  
make install
  这部分因为知识面的欠缺,实在是组织不起来,是一些上课的笔记和自己的理解。
  标准的程序安装要下面这么多的步骤,不过我们不用自己手动执行:
  源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 链接 --> 执行
  库是一种功能的实现,调用它就可以直接使用这个功能:
  库是可执行程序,但本身不能作为程序执行入口,只能被调用。
DSC0000.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
  这个可不要轻易尝试,除了内嵌命令,都不能运行了。甚至都不能登录了。玩大了,救援了 DSC0001.gif
  API: Application Programing Interface   应用编程接口,也就是库的调用接口。
  ABI: Application Binary Interface  应用二进制接口,这个就属于低层的运行方式。
  API兼容,意味着开发库兼容, 因此,源代码可跨平台
  ABI兼容,编译后的程序可以跨平台。
  库调用: 开发调用,运行调用。
  开发调用(API),是根据头文件来设置函数的各种参数,参数又是怎么传递的。函数就是库的接口。从而来调用库的各种功能。
  因为各个系统有通用的API接口,这也就实现了源代码的跨平台。当然有的程序不只是只调用API,也有可能调用系统调用。而这个的跨平台取决于系统接口的一致性。如POSIX标准。
  POSIX: 可移植操作系统接口(Portable Operating System Interface)
  此标准用来定义操作系统的接口规范(系统调用接口),以实现在不同的操作系统上只要重新编译程序就可以运行。但现在只是实现了一部分的调用接口。所以有些代码还是不能直接跨平台的。
  以上都是在编译之前的,如果是想在编译之后的跨平台,那就取决于ABI了。
  运行调用(ABI),是直接调用库的二进制程序。 不同的CPU架构,不同的操作系统,所组织 的二进制方式也不一样。 ABI的不同。如以下:
  1、 OS平台:应用程序必须是特定OS平台所支持的版本。因为二进制的组织格式不一样。
  2、 硬件平台: 应用程序必须为特定的CPU所支持。因为CPU汇编指令集的不同。
  在这里二进制根本就无法展开运行。就算是CPU架构相同。系统的不同,也会导致二进制的执行格式不同,二进制的切入执行点都不对,当然无法执行,动都无法动,更别提调用库了。其实我也不是很清楚,朋友就当看故事吧。
  程序编译会自动采用所在OS平台的库。 如 64的系统 64的库。
  源代码翻译成二进制程序,其实就是翻译成了可以被当前CPU指令集所能够执行的二进制程序。
  amd 64bit 和 intel 64bits 的CPU架构是相同的。指令集也是相同的。 都是x86系列。
  二、安装
  编译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]# lsbin  build  cgi-bin  error  htdocs  icons  include  lib  logs  man  manual  modules  这里是我们所指定的配置文件的位置。
[root@localhost httpd2.2]# ll /etc/httpdtotal 92drwxr-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.typesdrwxr-xr-x. 3 root root  4096 Dec 27 02:28 original[root@localhost httpd2.2]#  安装后配置
  1、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]# httpdhttpd: 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变量中已经有软件所在的路径了。
  2、导出库文件的路径
  在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 directoryldconfig: Path `/usr/lib' given more than onceldconfig: Path `/usr/lib64' given more than onceldconfig: Can't stat /usr/libx32: No such file or directory/usr/local/httpd2.2/lib:  我这里报了一堆错误,不过管它。看到最下面的/usr/local/httpd2.2/lib了吧,已经成功了。可以不加grep来看详细的信息。
  这些操作不是为了所安装的httpd要使用的,而是以后安装其它的程序可能会被依赖
  3、导出头文件:
  基于链接的方式实现: 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/ -ddrwxr-xr-x. 2 root root 4096 Dec 27 02:28 /usr/include/httpd2.2/  这里也不是为了所安装的httpd要使用的,而是以后安装的其它程序可能会使用。
  4、导出帮助手册:
  编辑/etc/man.config文件,添加一个MANPATH
  呃,这里说一下,我们这个CentOS7.1好像自动识别了。不用再配置了,直接man httpd就成功了。
  那么这里也不用说什么,在CentOS6上面直接编辑/etc/man.config文件即可。
  到这里就已经安装成功了。我这写的比较杂,东西也比较乱。但都是一些希望以后可以帮助到自己的东西,也希望可以帮助到朋友们。
  小话题:
  如果在我们编译软件的时候,终端实然断了怎么办,按理论来说,在此终端下的程序都会结束。编译了老半天,白忙活了。那么可以用screen程序。
  screen 模拟多个虚拟窗口,并且隐藏以后可以退出终端。
  screen 打开新的screen虚拟界面
  隐藏:Ctrl+a,d是在按住ctrl的情况下,按一下a,再按一下d。

  重新打开隐藏的 Screen: 显示各screen>  重新打开:screen -r Screen_ID
  只有一个模拟窗口,直接用screen -r就可以打开。
  Ctrl+a,d以后screen进程的父进程就会变成init。与本终端脱离父子关系。所以在终端结束以后编译也不会中断。

  screen -r>  这个在编译内核的时候常用到,而编译软件看情况吧。
  本文出自 “大蕃茄” 博客,请务必保留此出处http://fanqie.blog.51cto.com/9382669/1728628



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-637350-1-1.html 上篇帖子: 简单编译安装apache2 下篇帖子: 查看 PHP apache nginx mysql 是如何编译的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表