我试图编译一个开源项目的二进制文件,以便我们的用户不必自己编译它.
我注意到在一台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工具.您可能也对generic tips for packaging Linux soft感兴趣.