一、软件运行编译
1、软件相关概念
ABI 应用程序二进制接口
API 应用程序接口
POSIX 可移植操作系统接口
2、C语言程序的实现过程
源码=》预处理=》编译=》汇编=》链接=》可执行程序
3、动态链接和静态链接
静态链接,把需要链接的库文件包括进现有的项目中。
动态链接,可执行文件和库文件是分开的,执行的时候需要根据链接将库文件中的内容load到内存中。
动态库:.so | .dll 静态库 .a
查看二进制程序所依赖的库文件 ldd
二、软件包和包管理器
软件包:开源软件最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在GNU/Linux上运行的软件。用户急需系统能提供一种更加便利的方法来管理这些软件,当Debian诞生时,这样一个管理工具dpkg也就应运而生,可用来管理deb后缀的"包"文件。从而著名的“package”概念第一次出现在GNU/Linux系统中,稍后Red Hat才开发自己的rpm包管理系统。
软件包管理器功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,利用包管理器可以方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
注意:ubuntu的包叫deb包,小红帽的包叫rpm包,windows的包叫exe包。
redhat:rpm文件,rpm包管理器,
debian:deb文件,dpkg包管理器,
命名介绍:
源代码打包文件命名
name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release
#nginx-1.22.0.tar.gz
#major 主版本号
#minor 次版本号
#release 修正版本号
rpm包命名方式
name-VERSION-release.arch.rpm
VERSION: major.minor.release
release:release.OS
#http-parser-2.8.0-9.el8.x86_64.rpm
#httpd-2.4.37-41.module+el8.5.0+695+1fa8055e.x86_64.rpm
#nginx-1.14.1-9.module+el8.4.0+542+81547229.x86_64.rpm
#major 主版本号
#minor 次版本号
#release 修正版本号
#el8 EL是Red Hat Enterprise Linux(EL)的缩写, EL8是Red Hat 8.x,CentOS 8.x,
el8.4.0+ 是指 适配redhat8.4.0以上及centos8.4.0以上的系统
常见的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平台无关:noarch 跟平台无关的包里面,通常放的是手册文件
包的依赖
软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包,安装软
件包时,会因为缺少依赖的包,而导致安装包失败。
解决依赖包管理工具:
yum:rpm包管理器的前端工具 红帽
dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版代替 yum 红帽
apt:deb包管理器前端工具
zypper:suse上的rpm前端管理工具
CentOS
包管理器rpm
CentOS系统上使用rpm命令管理程序包,功能:安装、卸载、升级、查询、校验、数据库维护
yum和dnf
CentOS使用 yum, dnf 解决rpm的包依赖关系
YUM: Yellowdog Update Modififier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定
位软件包,up2date的替代工具
CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的
Ubuntu
dpkg:package manager for Debian,类似于rpm, dpkg是基于Debian的系统的包管理器。可以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项
apt:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基于客户/服务器架构(c/s)
三、程序包编译
有特定适用场景,在某些时候,我们没有办法直接使用已经编译好的包,有的时候跟系统其他软件冲突,有的时候某些依赖库装不上,有的时候需要裁减只要特定的几个特性和功能。在这种场景下我们就需要自行通过源码编译出符合自己的环境的二进制包。
编译之前需要有源码和编译工具链。
C语言源代码编译安装过程
./configure
make && make install