其实标题已经说明了一切。但请允许我具体说明一下问题:
假设我要编译一个使用 libffi、libGL、dlfcn 和 SDL 的应用程序,该二进制文件是否可以在具有相同架构的其他 Linux 发行版上运行?
我询问的原因是因为目录/usr/lib/i386-linux-gnu
—— 我可能错了,但我认为这个目录是 Ubuntu 特有的,不是吗?
那么,在 Ubuntu 上编译的二进制文件的可移植性到底有多高?
答案1
当您编译二进制文件(例如,nginx
从源代码编译)时,它会使用有关编译二进制文件的系统上的库版本的信息进行构建。当然,要引用的库由参数决定(对于nginx
,这是您想要激活或不激活哪些模块的定义)。但是,您构建的二进制文件(不太可能)会在单独的系统上运行,除非它是配置相同的系统。
您将需要在每个单独的系统上编译应用程序,您不太可能将编译后的版本移植到另一个系统上。可能没有每个库的兼容版本。
注意:当你能将二进制文件移植到另一个 Linux 系统,这是不明智的,而且通常很耗时。这是因为:
(1) 您需要确保要将二进制文件移动到的系统使用与libc
编译二进制文件相同的版本
(2) 您需要确保程序中使用的库能够在您的系统上轻松检测到,并且它们与创建程序时使用的版本相同(或兼容)。
...当然还有其他变量需要考虑。从长远来看,在每个系统上编译程序以使用比努力实现可移植性更容易。
答案2
一般来说是的,但具体情况要视情况而定。库有时会添加新功能。如果您开始使用这些新功能,那么您现在就依赖于该版本的库(因为旧版本没有它)。只要系统有您需要的库,并且至少有您需要的最低版本(并且是相同的架构),程序就可以正常运行。
如果您正在打包程序,debian 软件包系统可以检测您在库中调用的函数并确定所需的最低版本,以便软件包可以指定该信息,这样当人们在基于 debian 的系统上安装它时,它可以确保他们拥有所需的库。按照此过程,通常可以在 Ubuntu 上构建一个 .deb,它可以在 debian 和 mint 以及满足最低库要求的任何版本上安装和运行。