Mar*_*cny 5 linux static-libraries binary-compatibility dynamic-library
我试图编译一个开源项目的二进制文件,以便我们的用户不必自己编译它.
我注意到在一台32位ubuntu机器"A"上创建的一些二进制文件在32位机器"B"上不起作用,并且报告了丢失.so文件的错误.
但是,如果我在机器"B"上从头开始编译,那么所有错误都消失了.
是否有任何理由为什么编译目标机器上的代码会使这些错误消失?我只运行"./configure"和"make" - 而不是"make-install",所以它不像我在全球范围内制作这些.so文件.
可能是编译器检测到系统库中缺少.so文件,在这种情况下将静态库链接到可执行文件中?
Ubuntu如何编译其软件包以便在所有x86机器上运行i386软件包?
我想这个问题被称为"二进制兼容性"(堆栈溢出上有一个标记用于解决这些问题).当您在机器上链接二进制文件时,周围的环境会影响二进制文件,并且在另一台机器上运行后,它仍然会尝试查找类似于编译它的环境.
在这种情况下,对不同环境的容差称为二进制兼容性.
它是如何工作的?
这里的关键点是,即使您在不同的计算机上为链接器指定了相同的选项,您仍可能获得不同的二进制文件.例如,如果您将二进制文件与共享库链接,则您在构建的计算机上具有-lfoo
的确切版本foo
(例如libfoo.so.5
)将硬编码到二进制文件中.当它在机器上运行时B
,它可能只包含libfoo.so.4
,并且二进制文件将拒绝运行,因为它需要丢失的libfoo.so.5
so文件.这就是重新编译有用的原因,没有它就无法工作.
Ubuntu包 - 以及任何其他发行版的这些包都在相同的环境中编译(彼此).这就是他们安装得好的原因.分发供应商观察到每个下一版本都与以前的版本向后兼容.
我该怎么办?
如果您想使您的软件与不同的发行版兼容,那么它比您想象的要容易.首先,尝试在最早的发行版中编译您的应用程序.因为,正如我之前提到的,现代发行版通常是向后兼容的,你的软版本很可能会在没有问题的情况下运行在更新的发行版上.
要更彻底地检查生成的包并获得有关兼容性的更多建议,您可以从我们的免费Linux Application Checker工具中获取.您可能还对打包Linux软件的通用技巧感兴趣.