API:Application Programing Interface (应用编程接口)
POSIX:可移植
物理底层上是系统,系统上有各个系统接口可供调用
但是系统接口还是过于底层,不便于程序员编程和调用,于是在系统上又有了库,一个库调用可能包含多个系统调用指令。(系统多为C语言研发,所以库又称C库、系统库、系统集库)
库调用不论自身内部如何运算,向外输出统一的POSIX API接口,如此,程序源代码便可在各个不同的系统上调用库。
程序文件从源码到可以在设备上执行的过程:
程序源代码(文本、字串)——>预处理(变量声明、宏替换...等等)——>编译(编译成目标汇编代码 object coad)——>汇编(汇编为二进制机器指令代码)——>链接(共享库调用地址与代码相应符号链接)
静态编译:程序内部自带所需库文件。程序体积较大,但是可以不依赖外部环境。
共享编译:多数程序的选择。直接调用系统的库文件,依赖环境。
ABI:Application Binary Interface (应用二进制接口,linux和windows不兼容)
Linux二进制可执行文件格式EFI,windows二进制可执行文件格式exe。
不同系统之间二进制可执行文件格式格式不同,同时链接的共享库调用地址也不一样(如:/lib64和C\WINDOWS\SYSTEM32下的.dll文件)
虽然API接口统一了,但是因为ABI接口的不同,所以程序在LINUX和WINDOWS上还是不能兼容运行
但也是有办法可以实现兼容的:库级别的虚拟化
linux上可以安装WINE,以在linux上提供软件需要的windows虚拟库接口,windows上可以安装cywin,以在windows上提供软件需要的linux虚拟库接口.
系统级开发:C ,C++
二进制应用程序的组成部分:二进制文件、库文件、配置文件、帮助文件。(二进制文件、库文件是程序源代码的组成部分,配置文件、帮助文件是辅助部分,通常由程序员直接提供放置于源代码目录中,无需编译。)
应用级开发:java,Python,php,per1,ruby
JDK:java开发工具箱
JVM:java运行工具
程序包管理器:
debian:deb,dpt
redhat:rpm,rpm (redhat package manager)->(rpm is package manager)
源代码命名:name-version.tar.gz
version:主版本号major次版本号minor发行版本号release
rpm包命名方式:name-version-arch.rpm
version:与源码一致: 主版本号major次版本号minor发行版本号release
arch: rpm包的发行版本号release,[os适用系统级别],arch运行平台、架构
rpm包可拆包为:主包,支(子)包
包之间存在依赖关系
testapp-version-arch.rpm 主包
testapp-devel-version-arch.rpm 支包
yum:rpm包管理的前端工具,补充和丰富了rpm功能,用于实现对程序包之间的依赖关系做分析,并自动对依赖包进行下载、安装、删除。
查看二进制程序所依赖的库文件:
#ldd /PATH/TO/FILE
管理及查看本机装载的库文件
ldconfig,直接配置
#ldconfig -p 显示已经缓存的所有可用的库文件的名称和文件路径的映射关系
配置文件为:/etc/ld.so.conf,/etc/ld.so.conf.d/*.conf
缓存文件:/etc/ld.so.cache
程序包管理器
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷的实现程序包的安装、卸载、查询、升级和校验等管理操作
- 程序的组成清单(每个包独有)
- 文件清单
- 安装或卸载时运行的脚本
- 数据库(公共)
程序包名称及版本
依赖关系
功能说明
安装生成的各文件的路径及校验码信息
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum,dnf
获取程序包的途径:
- 系统发行版的光盘或官方的服务器
Centos镜像:http://mirrors.aliyun.com
- 项目官方站点
- 第三方组织
首选:Fedora-EPEL组织
收索引擎:
4、自制