程序在面临跨平台,不同的环境时会受到以下条件都制约
不同的操作系统(例如linux Windows unix),用的二进制的格式不相同,所以相同的代码在编译成二进制程序后则无法跨平台运行,因调用格式不同。
1. 库文件
2. API相同的情况下,源代码可以跨平台
3. ABI 相同的情况下,安装编译后的程序可以跨平台
4. 应用程序必须为特定的cpu所支持
5. 不同cpu架构上的程序无法跨平台运行
6. 64位系统与32位系统的程序无法相互兼容。
7. os平台:编译好的应用程序必须为特定平台所支持的版本
总结:最终应用程序还是以0和1的二进制方式运行在cpu中的,相同的源代码在通过编译器变成二进制程序时,编译器会根据具体的CPU架构,调用规则在当前环境把源代码变成可以处理的二进制程序。从而实现跨平台运行。但是当源代码已经变成二进制程序时,实际的环境和CPU的规则已经被固定了,所以不同的CPU,操作系统,和64位/32位系统因环境不同,CPU规则不同等任何一个环境出现差别都会造成数据混乱无法按照自己的既定规则解读二进制程序。所以已经编译好的二进制程序如果想要在不同的电脑运行,必须和编译的时候所处的环境完全一样才可以。
这里的环境指的的是:
硬件CPU架构完全一样(设计CPU指令集需要一样)
操作系统完全一样
使用到的ABI库完全一样
操作系统位数完全一样(硬件可以相互兼容,但是软件不同位数的调用的库是不同的)
运行平台的版本号一样(这个根据具体情况,如果使用的到的东西里面,两个版本号的没有差别可能也不影响操作。但是如果有版本号检测之类的功能则一般会不运行继续执行。猜测。)
所以二进制程序下载时要考虑操作系统是否兼容,底层的硬件是否兼容。
应用程序包的组成部分
- 二进制程序
- 存放位置:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/loacl/sbin
- 自身的库文件
1. /lib /lib64 /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64
2. 开发时调用API,运行时调用ABI
3. 通过调整/etc/ld.so.conf /etc/ld.so.conf.d/*.conf - 配置文件
- /etc 无需另外配置
- 帮助文件
- man文件,info文件,README,INSTALL,ChangeLog。
- 以man文件为例:命令本身是到某个路径下查找与程序名相同通常以.gz结尾的文件的名字/usr/share/man
添加man命令到新的路径下查找man文件 2中方法
1、 vim /etc/man.config(contOS7中:man_db.conf) 修改这个文件
2、 man -m 新的路径 命令名(或许不用命令名)
程序包管理器:解决程序安装,依赖,卸载等繁琐问题
程序包管理器组成部分
- 数据库:
- 名称和版本,
- 安装生成的各文件路径,校验码,
- 依赖关系
- 提供功能性的说明
- 提供程序组成格式:
- 文件清单
- 安装卸载时运行的脚本
应用程序:源代码 name-major.minor.release.tar.gz
解决依赖关系:
循环依赖:
版本依赖:
包管理器名称
Debian:.deb dpkg
RadHat: .rpm(perl编写),rpm(RadHat Package Manager)
rpm:RPM is Package Manager
SUSE: rpm
包管理器的基本功能
打包
安装
查询
升级
卸载
校验
数据库管理
解决依赖关系—用前端管理器
apt-get
yum
应用程序的安装方式
- 使用包管理器:便捷、易用
- 包管理器的前段管理:yum
- 源代码编译:
- 简单打包的二进制格式:
本文探讨了程序在跨平台环境中的安装、卸载和依赖管理问题。重点介绍了应用程序包的组成部分,包括二进制程序、库文件、配置文件和帮助文件。还详细阐述了程序包管理器如何简化这些过程,尤其是通过数据库管理和前端管理器如dpkg、rpm、apt-get和yum来解决依赖关系。此外,提到了ldd命令在检查共享库依赖关系中的作用,并简要提及了rpm包管理器的使用。
19万+

被折叠的 条评论
为什么被折叠?



