【问题标题】:Linux, compile a piece of code in one host, to run in another?Linux,在一台主机上编译一段代码,在另一台主机上运行?
【发布时间】:2012-09-29 14:51:06
【问题描述】:

代码是c/c++编写的,可能依赖于编译主机中的一些库; 它应该在另一个没有库的主机上运行,​​具体取决于问题。两台主机都是linux,可能有不同的版本。 你有好的策略吗?

【问题讨论】:

  • 也许很容易安装需要的动态库

标签: linux cross-compiling abi


【解决方案1】:

考虑此问题的所有答案(静态链接、在最旧的 Linux 上编译等),然后通过 Linux App Checker 检查您的最终二进制文件,以显示与其他 Linux 发行版的兼容性问题。

【讨论】:

    【解决方案2】:

    Linux 上的纯静态链接是 discouraged,只有当您使用 C++ 无法选择的替代 libc(例如 Dietlibc)时才有可能,我的 favoured 方法是在最旧的版本上构建应用程序您必须支持的 Linux 版本,因为较新的 libc 版本将具有向后兼容性。

    这将仅涵盖 libc,其他要求,例如 gtk、pangom 等必须直接编译到您的二进制文件中。

    【讨论】:

      【解决方案3】:

      大多数平台都有定义明确的 ABI,涵盖 C 代码,但涵盖 C++ 功能的 ABI 还不常见。

      仅使用 libc 以 c++ 编写的程序可能无法在其他平台上运行。 如果二进制兼容性是一个重要问题,请考虑使用 c。

      【讨论】:

      • 为什么你认为c++库不能保持二进制兼容性,而c可以?
      • 对于 C++,有 3 个主要类别:Itanium C++ ABI、Microsoft ABI 和其他。您根本无法链接到与您的 ABI 不同的库。根据我自己的经验,在标准 Fedora 14 发行版上编写的简单“hello world”可执行文件在“debian lenny”上产生“seg fault”(我不记得库版本!!)
      【解决方案4】:

      静态链接应用程序,使其依赖尽可能少的动态加载库。这是这个问题的一般解决方案。

      其他解决方案包括:

      • 随应用程序提供所需的库,并覆盖系统的 LD_LIBRARY_PATH 变量以使包含的版本成为首选版本。
      • 编写代码以使用dlopen() 和朋友动态加载库,并手动处理库版本的差异。

      【讨论】:

        猜你喜欢
        • 2019-11-20
        • 2016-05-23
        • 1970-01-01
        • 1970-01-01
        • 2017-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多