2025年春节期间 DeepSeek 带起的人工智能热潮依然滚烫。百度、腾讯、阿里这些巨头纷纷将 DeepSeek 融入到他们的产品中,而更多竞争对手也发布了各自的大模型,宣称已经超越了 DeepSeek。看着这一波接一波的消息,仿佛我们的世界即将被 AI 颠覆:AI 公务员、DeepSeek 推理、一体机AI 智能体、裁员风波等等,消息乱飞,似乎一夜之间人类社会要发生翻天覆地的变化。
作为一名开发者,我自然页会关注与 AI 相关的资讯。然而,接收到的信息多了,心中不免有些困惑:一方面是 AI 的飞速进展,仿佛一夜之间就能代替人类;另一方面,我又被工作中的具体问题而困扰。这段时间没有更新公众号,就是受到工作的影响。这期间我一直被浏览器的系统问题整得焦头烂额,都没有心思去写文章。
说到底,我碰到的就是大多数 C/C++ 程序员不想面对的兼容性难题,特别是随着国产化替代,尤其是在国产化浪潮下,操作系统和硬件平台日益增多,兼容性问题已经成了绕不开的痛点。
随着国产化软硬件崛起,开发者不得不面对更多的平台支持问题。就拿 CPU 架构来说有 x86(x64)、龙芯(LoongArch64、MIPS)、申威(SW64)、ARM(飞腾、华为麒麟等),操作系统则有 UOS(包括 deepin)和麒麟(包括 OpenKylin 等),不同版本的操作系统也在不断变化,像 UOS 有 1050、1060、1070 等版本。只要稍一数,能有几十种软硬件平台的组合。
通常情况下,操作系统和系统库对跨平台的支持做得还不错,作为应用程序开发者,一般不会针对所有平台开发,而是选择主流平台组合,这样就能避免大多数兼容性问题。但是,如果碰到问题,就会是比较棘手的难题。因为同样的代码,在不同的平台上表现不一样,甚至崩溃,一般需要系统开发者配合一起查找问题。
说实话,尽管 Windows 常被吐槽,但从兼容性上看,Windows 做得还是相当不错的。而 Linux 系统版本众多,经常更新,导致兼容性相对较差。
说到兼容性,就不得不提 ABI(应用二进制接口)。ABI 兼容性是指不同版本的库之间保持一致性,确保旧版程序能够在新版库中正常运行。如果 ABI 不兼容,程序很可能会出现运行不正常的问题。
动态库的 ABI 兼容性是指不同版本的动态库能保持一致的二进制接口,使得旧版本编译的程序能在新版库环境下正常运行。下面我们来看一下 ABI 兼容的几个关键点:
glibc 和 OpenSSL 在 ABI 兼容性方面做得很好,但问题在于,这些库变得越来越复杂,废弃的接口越来越多,导致库文件越来越大。于是,很多系统开始采用精简版的 C 库,例如 Android 使用 Bionic 库,BoringSSL 则从 OpenSSL 中分叉出来,删除了很多接口,但不提供 ABI 兼容。
由此可见,软件开发也是一个平衡的艺术,需要开发人员根据实际情况进行取舍。
sysroot 是嵌入式开发中引入的概念,指向一个目录,该目录模拟目标系统的根文件系统结构,包含了编译、链接、运行所需的头文件、库文件等。
在嵌入式开发中,开发者通常在一个平台上(如 x86 主机)进行开发,但目标平台可能是另一个架构(如 ARM)。由于平台架构不同,直接在主机上编译的程序无法在目标平台上运行,因此需要使用 sysroot 来确保编译的应用程序能够在目标系统上正常运行。
sysroot 的作用包括:
Chromium 构建系统提供了一个 use_sysroot
选项。当 use_sysroot
设置为 true
时,Chromium 会下载一个 Debian Bullseye 版本的 sysroot 作为编译环境,帮助构建符合“最低公共平台”标准的二进制文件,从而确保它们能够在多个发行版上运行,包括 Debian、Ubuntu、Deepin 等。
Bullseye 的库版本相对稳定,且被多个发行版支持,这使得通过它编译的二进制文件在新版系统中能够兼容运行。Chromium 构建系统会对库依赖和编译选项进行严格控制,避免引入最新系统才有的特性,确保兼容性。
然而,sysroot 也并非万能。虽然它能够解决很多兼容性问题,但也存在一些挑战。例如,浏览器在 ARM 架构下开启沙盒时会崩溃,最终通过升级 sysroot 来解决。随着操作系统和库版本不断更新,如何更新 sysroot 中的库,确保与目标系统保持一致,依然是一个挑战。
玲珑应用(Linglong Application)是近年来在国产操作系统中逐步推广的一种应用包格式。关于玲珑应用的介绍请参考我之前的文章:
这里说一说玲珑应用在解决系统兼容性方面的几个突出的优势:
在人工智能如 DeepSeek 一样迅猛发展的今天,系统软件开发者依然在跨平台兼容性、系统库 ABI 兼容性和 sysroot 管理等问题上面临挑战。你在 DeepSeek,我在 deepin Coding,尽管我们的方向不同,但我们都在各自的领域努力探索、前行, 我们都有光明的未来。