加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

在linux中为所有x86机器创建通用二进制文件

发布时间:2020-12-13 19:03:19 所属栏目:Linux 来源:网络整理
导读:我试图编译一个开源项目的二进制文件,以便我们的用户不必自己编译它. 我注意到在一台32位ubuntu机器“A”上创建的一些二进制文件在32位机器“B”上不起作用,并且报告了丢失.so文件的错误. 但是,如果我在机器“B”上从头开始编译,那么所有错误都消失了. 是否

我试图编译一个开源项目的二进制文件,以便我们的用户不必自己编译它.

我注意到在一台32位ubuntu机器“A”上创建的一些二进制文件在32位机器“B”上不起作用,并且报告了丢失.so文件的错误.

但是,如果我在机器“B”上从头开始编译,那么所有错误都消失了.

是否有任何理由为什么编译目标机器上的代码会使这些错误消失?我只运行“./configure”和“make” – 而不是“make-install”,所以它不像我在全球范围内制作这些.so文件.

可能是编译器检测到系统库中缺少.so文件,在这种情况下将静态库链接到可执行文件中?

Ubuntu如何编译其软件包以便在所有x86机器上运行i386软件包?

最佳答案
我想这个问题被称为“二进制兼容性”(堆栈溢出上有a tag专门用于解决这些问题).当您在机器上链接二进制文件时,周围的环境会影响二进制文件,并且在另一台机器上运行后,它仍然会尝试查找类似于编译它的环境.

在这种情况下,对不同环境的容差称为二进制兼容性.

它是如何工作的?

这里的关键点是,即使您在不同的计算机上为链接器指定了相同的选项,您仍可能获得不同的二进制文件.例如,如果使用-lfoo将二进制文件与共享库链接,则在您构建的计算机上具有的foo的确切版本(例如,libfoo.so.5)将硬编码到二进制文件中.当它在机器B上运行时,它可能只包含libfoo.so.4,并且二进制文件将拒绝运行,因为它需要缺少libfoo.so.5 so文件.这就是重新编译有用的原因,没有它就无法工作.

Ubuntu包 – 以及任何其他发行版的这些包都在相同的环境中编译(彼此).这就是他们安装得好的原因.分发供应商观察到每个下一版本都与以前的版本向后兼容.

我该怎么办?

如果您想使您的软件与不同的发行版兼容,那么它比您想象的要容易.首先,尝试在最早的发行版中编译您的应用程序.因为,正如我之前提到的,现代发行版通常是向后兼容的,你的软版本很可能会在没有问题的情况下运行在更新的发行版上.

要更彻底地检查最终的包装并获得有关兼容性的更多建议,您可以使用我们的免费Linux Application Checker工具.您可能也对generic tips for packaging Linux soft感兴趣.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读