程序包编译安装
为什么要对程序包进行编译安装?
有些特性是编译选定的,如果编译未选定此特性,将无法使用。
rpm包的版本会落后于源码包,甚至落后很多。
通常我们的安装分两钟:
第一是从网上下载testapp-VERSION-release.src.rpm源码包,编译后进行安装---我们今天探讨的问题
第二种是使用rpmbuild命令制作成二进制格式的rpm包,而后再安装;
首先了解一个源码到执行经历了哪些路途
代码执行的过程:源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 链接 --> 执行
源代码组织格式:多文件:文件中的代码之间,很可能存在跨文件依赖关系;
源码安装的原理是什么呢?
C、C++: make (configure --> Makefile.in --> makefile)
源码安装过程的简单介绍:源码程序包里有一个configuer的命令,它通过Makefile.in模版生成一个makefile文件。make通过makefile文件的设定组织源码生成一个二进制程序包,然后makeinstall安装到指定路径就可以了。 注:make 是c、c++源码的项目管理工具 小拓展:java: maven 注:maven是jave源码的项目管理工具
C代码编译安装三步骤:
建议:安装前查看INSTALL,README
第一步:./configure:
作用:(1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及Makefile.in文件生成makefile;
(2) 检查依赖到的外部环境;
第一步使用方法详解:
./configure 选项:指定安装位置、指定启用的特性
--help: 获取其支持使用的选项
选项分类:
安装路径设定:
--prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/
--sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;
可选特性:
--disable-FEATURE
--enable-FEATURE[=ARG]
可选包:
--with-PACKAGE[=ARG]
--without-PACKAGE
第二步:make:
作用:根据makefile文件,构建应用程序; 注:直接make就行
第三步:make install 注:直接make install就行
作用:就是为了把编译好的文件放在指定的路径下 【配置文件、库文件 帮助文件】)
大家肯定现在就像去编译了吧,我们还需要一点准备工作
编译C源代码:前提:提供开发工具及开发环境
开发工具:make(项目构成工具), gcc (c源码的编译器)
开发环境:开发库(glibc:标准库),头文件
以上需要的环境,我们只需要安装两个包组,就可以愉快的编译了
CentOS 6和7: "Development Tools", "Server Platform Development",
安装以后,小伙伴们别急。想使用劳动成果还需要做一下工作呢
安装后的配置:
(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
举例完整编译nginx程序
前提:准备开发环境(编译环境)
红帽5 安装“Development Tools”和“Developments Libraries”
拿到源程序后先tar解压缩,然后cd到目录里面去
#tar xf tengine-1.4.2.tar.gz
#cd tegnine-1.4.2
./configure
--prefix=/path/to/somewhere 注:软件安装的位置
--sysconfdir=/path/to/conffile_path 注:指定配置文件的路径
例如:./configure --prefix=/usr/local/tengine --conf-path=/etc/tengine/tengine.conf
#make 注:编译
#make install 注:安装
# /usr/local/tengine/sbin/nginx 注:启动nginx程序
此时/usr/local/tengine/sbin不在环境变量里,所有必须全路径才可以启用。
#vim /etc/profile
PATH=$PATH:/user/local/tengine/sbin 注:在export之前一行添加,然后让系统重读这个脚本
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
#source /etc/profile 让系统重读此文件,需要重启机器才可以有效。或者不重读,重新登陆一下机器也可以生效
注意:
我们安装软件包,如果安装在非默认路径下要修改path环境变量
1、修改PATH环境变量,以能够识别此程序的二进制文件路径
方法一:修改/etc/profile文件
方法二:在/etc/profile.d/目录建立一个以.sh为名称后缀的文件,在里面定义export PATH=$PATH:/path/to/somewhere
2、默认情况下,系统搜索库文件的路径/lib, /usr/lib,要增添额外搜寻路径
在/etc/ld.so.conf.d/ 中创建 .conf为后缀名的文件,而后把要增添的路径直接写至此文件中(下次重启能找到库了)
#ldconfig (执行此命令可以重新搜寻库文件)
-v:显示重新搜寻库的过程
3、头文件(二次开发的软件提供输出库功能的,它都有头文件),任何一个二进制程序要想调用别人的库,要提前声明并包含到当前系统中
来。就需要include包含库文件所提供的功能的
头文件里有函数、参数、以及参数类型等相关属性
头文件需要输出给系统,默认:/usr/include
自定义:增添头文件搜寻路径,使用链接
把/usr/local/tengine/include/ 链接到/usr/include/下有两种方法
第一:ln -s /usr/local/tengine/include/* /usr/include/ 注:不该变文件名,把include下所有文件链接到/include这个目录下
第二:ln -s /usr/local/tengine/include /usr/include/tengine 注:把include目录链接到include/下的一个目录,并命名tengine
4、手动编译的man文件不在标准路径的时候。
man文件路径:安装在--prefix指定的目录下的man目录。 标准:/usr/share/man
方法一:man -M /PATH/TO/MAN_DIR COMMAND
方法二:在/etc/man.config中添加一条“MANPATH //usr/local/tengine/man”
netstat:显示网络状况的命令
-r:显示路由表
-n:以数字方式显示
-t:显示tcp的连接
-u:显示udp连接
-l:显示监听状态的连接
-p:显示监听指定的套接字的进程的进程号及进程名
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
了解:开发工具:autoconf: 生成configure脚本 automake:生成Makefile.in
看了这个你大概知道源码包里configure和 Makefile.in怎么来的了。
开源程序源代码的获取:
官方自建站点:
apache.org (ASF)
mariadb.org
...
代码托管:
SourceForge
Github.com
code.google.com