一、linux程序包基础概念
1.1、linux程序开发遵循开源协定:GPL, BSE, Apache等
1.2、源程序常用的开发语言:C, C++, perl, python等
1.3、应用程序的开发、编译和运行
就像面包师直接使用的材料是面粉而非麦种一样,我们大部分应用程序员在开发程序时也并非直接接触硬件层,因为底层硬件太过抽象和“丑陋”,如果应用程序开发都从底层开始,无疑工作量巨大。于是,有些系统级程序员在“裸机”上抹上了一层操作系统,用于管理硬件资源,这个系统软件离用户更近了一些,就好比把麦种变成了麦粒。操作系统仍然比较抽象,于是又有部分库级别程序员在在操作系统基础上开发出了一些可以直接拿来用的函数或类(称为库文件),离用户再近了一层,这一阶段好比将麦粒磨成了面粉。因此,我们的应用程序员可直接调用这些库文件进行编程而不用关心底层工作机制。
①API(Application Programming Interface,应用程序编程接口)即上面提到的程序开发和运行时所依赖的库(开发库、运行库),库是一些做好的功能模块,好比能直接拿来用的“零件”,但它无执行入口,不能独立执行,只能被独立运行的程序调用时执行。
②应用程序开发除了依赖于函数库之外,还依赖于头文件(head)。头文件是应用程序和函数库之间的纽带,它是对函数库所作的声明,例如告诉我们可调用哪些函数、函数可接受的参数类型等等。在linux中,头文件后缀为.h,位于/usr/include目录下
③源程序编写好之后,接下来就是编译了。程序编译指把用高级语言编写的源程序,翻译成机器可执行的二进制格式文件的过程,一般要经过预处理→编译→汇编→链接几个步骤。
编译又分为静态编译和动态编译:
静态编译:指编译器在编译程序时,将程序需要调用的库函数提取出来并包含进程序中,即“自带零件”。这种编译方式的优点是可移植性强,缺点是执行文件体积大。
动态编译: 简而言之就是“不带零件”。优点是编译速度快,执行文件体积小,缺点是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
④ABI(application binary interface,应用程序二进制接口)即系统内核支持的二进制接口,硬件平台决定了系统兼容的ABI。因此在x86平台上静态编译好的可执行文件能运行于同硬件平台的各种系统上,但不能运行于其它硬件平台如powpc,arm之上
总结:相对于API,ABI更接近于硬件。API关乎操作系统,ABI关乎硬件平台。应用程序运行既依赖于ABI,也依赖于运行库。在基于X86平台的windows上编译好的的二进制格式文件无法在基于arm平台的linux上运行,因为二者的ABI不同;即使是对于同一硬件平台的windows和linux,在windows上动态编译好的可执行文件也不一定能在linux上运行,因为二者的运行库可能不同
1.4、linux程序的组成与包格式:
①linux程序安装后的组成部分:
二进制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin, /usr/local/APP/{bin,sbin}
注意:有些特殊的应用程序放置于libexec目录;有些第三方应用默认安装于/opt目录
库文件(开发库、运行库):/lib64, /usr/lib64, /usr/local/lib64, /usr/local/APP/lib
ldd:显示程序所依赖的共享库
用法:ldd /path/to/binary_file,如ldd /bin/ls
配置文件:/etc, /usr/local/APP/etc或conf目录
帮助文件:/usr/share/man, /usr/local/share/man, /usr/local/APP/man
[root@localhost ~]# ldd /bin/ls linux-vdso.so.1 => (0x00007fff45104000) libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003463400000) librt.so.1 => /lib64/librt.so.1 (0x0000003462400000) # 前面为库文件名,后面为库文件路径 libcap.so.2 => /lib64/libcap.so.2 (0x0000003465000000)
②linux上的程序包有三种格式:源码包、二进制格式包、rpm格式包。
二、源码编译安装
现在大部分的应用程序都使用rpm格式包安装,安装简便且易于管理,但因为rpm格式包是编译过的程序包,有时候并不能满足个体的特殊需求,某些程序也是没有rpm格式包的,因此需要源码编译安装
2.1、源码包的命令格式:name-version.tar.{gz,bz2,xz},其中version:major.minor.release,例如bash-4.2.3.tar.gz
2.2、开源应用程序的来源
①自建站点:如apache,mysql,drbd...
②代码托管:如SourceForge,github.com,code.google.com...
2.3、源代码编译工具:
gcc(gnu c complier):编译C程序
gcc-c++:编译C++程序
2.4、源代码的组织格式:源代码是以多文件的形式组织的,此为方便修改和管理,不至于因为某个代码段的更改而重新编译整个代码。各文件中的代码是有依赖关系的
2.5、GNU make:项目管理工具,它把分散于各个文件中的代码段组织起来,自动判断程序的各部分的编译顺序,哪些部分需要再编译等,并且调用编译工具(如gcc)来执行编译操作。
2.6、编译安装源程序的步骤:
①tar tar xf testapp-version.tar.{xz|bz2|gz}
②cd testapp-version
③./configure #configure脚本的作用一是检查编译环境,而是配置所要编译的功能。它会结合另一个文件Makefile.in生成供make工具使用的makefile
④make #make工具会读取makefile并调用编译工具进行编译
⑤make install #安装
注意:编译之前需确保基本的开发环境已准备好,Server Platform Development和Development tools这两个开发包组是必须要有的。另外,程序编译可能还依赖于特定的开发包,可根据提示安装
2.7、configure脚本的使用
①获取帮助:./configure --help
②一些较通用选项
安装路径相关:
--prefix=/path/to/somewhere #指定安装路径,若不指定,程序的各部分文件会多分散于多个目录,不易于管理
--sysconfdir=/path/to/somewhere #指定配置文件安装路径
指定启用/禁用的特性:
--enable-FEATURE,例如--enable-fpm
--disable-FEATURE,例如--disable-socket
指定所依赖的功能、程序或文件:
--with-FUNCTION[=/path/to/somewhere]
--without-FUNCTION
注意:每个程序可配置的选项可能不同,具体以./configure --help为准
2.8、安装后的配置
■程序运行:
①输入程序名直接运行而无需输入其绝对路径
vim /etc/profile.d/APPNAME.sh #将程序的二进制文件所在目录加入PATH环境变量中
export PATH=$PATH:/path/to/somewhere
②导出手册页
编辑/etc/man.config文件,添加一项MANPATH,路径为新安装程序的man目录
或者在命令中通过选项指定man手册搜索的路径:man -M /path/to/somewhere KEYWORD
■程序开发:如果其它应用程序依赖此程序的开发环境,或针对此程序做二次开发
系统默认搜索位于/lib64,/usr/lib64及配置文件/etc/ld.d.conf所列目录下的库文件,不会搜索/usr/local/lib64和/usr/local/APPNAME/lib目录中的库文件
①导出库文件
第一步:指定让系统搜索定制的路径
编辑/etc/ld.so.conf.d/APPNAME.conf,输入库路径
第二步:使用ldconfig命令触发系统重新搜索所有的库文件并生成缓存,缓存文件默认为/etc/ld.so.cache
②导出头文件
系统读取头文件的路径是:/usr/include
假设程序的头文件路径是:/usr/local/APPNAME/include
导出方式:创建软链接
ln -sv /usr/local/APPNAME/include /usr/include/APPNAME
2.9、示例:简单编译安装nginx
[root@localhost ~]# yum grouplist | grep ‘Develop‘ #查看基本开发包组是否已安装 Additional Development Desktop Platform Development Development tools Server Platform Development [root@localhost ~]# tar xf nginx-1.4.7.tar.gz #解压源码包 [root@localhost ~]# ls anaconda-ks.cfg Documents install.log Music nginx-1.4.7.tar.gz Public Videos Desktop Downloads install.log.syslog nginx-1.4.7 Pictures Templates vmware-tools-distrib [root@localhost ~]# cd nginx-1.4.7 [root@localhost nginx-1.4.7]# ls auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src [root@localhost nginx-1.4.7]# ./configure --help #查看可配置的功能 --help print this message --prefix=PATH set installation prefix --sbin-path=PATH set nginx binary pathname --conf-path=PATH set nginx.conf pathname --error-log-path=PATH set error log pathname --pid-path=PATH set nginx.pid pathname ... [root@localhost nginx-1.4.7]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf checking for OS + Linux 2.6.32-431.el6.x86_64 x86_64 checking for C compiler ... not found ./configure: error: C compiler cc is not found #提示无C程序编译器 [root@localhost nginx-1.4.7]# yum -y install gcc #安装gcc ... Complete! [root@localhost nginx-1.4.7]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf ... ./configure: error: the HTTP rewrite module requires the PCRE library. #提示需要pcre库 You can either disable the module by using --without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using --with-pcre=<path> option. [root@localhost nginx-1.4.7]# yum -y install pcre-devel #安装pcre开发包 ... [root@localhost nginx-1.4.7]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf ... ./configure: error: the HTTP gzip module requires the zlib library. #提示需要zlib库 ... [root@localhost nginx-1.4.7]# yum -y install zlib-devel ... [root@localhost nginx-1.4.7]# ./configure --prefix=/usr/local/nginx --conf-path=//etc/nginx/nginx.conf ... [root@localhost nginx-1.4.7]# make #调用编译工具执行编译 ... [root@localhost nginx-1.4.7]# make install #安装 ... [root@localhost nginx-1.4.7]# cd /usr/local/nginx [root@localhost nginx]# ls html logs sbin [root@localhost nginx]# sbin/nginx & [1] 5455 [root@localhost nginx]# ss -tnlp [root@localhost nginx]# vim /etc/profile.d/nginx.sh export PATH=$PATH:/usr/local/nginx/sbin #将该程序的二进制文件目录路径加入PATH变量 [root@localhost nginx]# . /etc/profile.d/nginx.sh #重读该配置文件 [root@localhost nginx]# echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin #编译安装的服务程序无服务脚本,需额外提供
三、二进制格式包的使用
二进制格式包即已经编译过的程序包,因此解压后就可直接使用,类似于windows系统上的绿色软件
3.1、二进制格式包的命令格式:name-version-OS-arch-.tar.{gz,bz2,xz},其中version:major.minor.release,OS为二进制格式包适用的系统,arch为适用的硬件平台。例如mysql-5.5.42-linux2.6-x86_64.tar.gz
3.2、为便于管理,二进制格式包一般解压到/usr/local目录下
[root@localhost ~]# tar -xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local [root@localhost ~]# ls /usr/local bin etc games include lib lib64 libexec mysql-5.5.33-linux2.6-x86_64 sbin share src [root@localhost ~]# mv /usr/local/mysql-5.5.33-linux2.6-x86_64/ /usr/local/mysql [root@localhost ~]# cd /usr/local/mysql [root@localhost mysql]# ls bin COPYING data docs include INSTALL-BINARY lib man mysql-test README scripts share sql-bench support-files ...
原文地址:http://9124573.blog.51cto.com/9114573/1707213