【问题标题】:Porting a Unix program from one host to another将 Unix 程序从一台主机移植到另一台主机
【发布时间】:2012-07-19 12:22:17
【问题描述】:

我有一个远程 Unix 服务器,我想在其上运行各种程序。我可以轻松地设置一个运行某种 Unix 风格的本地虚拟机,我可以在其上编译我的程序。问题是,将 Unix 程序从一台主机移动到另一台主机似乎总是会失败。 :-(

例如,我在 OpenSUSE 11.4 系统上编译了test,并尝试运行它。它工作得很好。但是后来我将编译好的二进制文件复制到了 Debian 6.0.3 系统,现在它拒绝运行。相反,我只是得到

测试:加载共享库时出错:libgmp.so.10:无法打开共享对象文件:没有这样的文件或目录

大概安装编译器也会安装所有依赖项 - 但仅限于本地机器上。我大概必须以某种方式猜测我需要在远程机器上放置哪些依赖项。

最重要的是,我没有远程机器的 shell 访问权限。我只有FTP。所以我不能安装任何东西。我只能将文件复制到它。所以我想知道我是否可以将必要的共享库复制到与编译的二进制文件相同的文件夹中。那行得通吗?还是我必须做一些更复杂的事情?

【问题讨论】:

  • 如何在没有 shell 的远程机器上执行程序?您将需要能够设置环境变量以最有可能显示共享库的位置,除非您只是静态链接整个内容。 (*.com/questions/1437393/… 可能会对您有所帮助,虽然无法访问 shell,但可能不会。)
  • 二进制文件应该通过 CGI 运行。将 Web 浏览器指向适当的 URL 会导致二进制文件运行。或者,吐出一个链接器错误——但不是我能读到的任何地方。 :-(

标签: linux


【解决方案1】:

在这种情况下,我认为你最好的选择是编译一个静态二进制文件;请参阅gcc-static 选项。但是,这有缺点,可能并不总是有效。

您也可以尝试复制共享库,但是您需要指示动态加载器在您添加它们的位置搜索库(您的二进制文件必须使用-Wl,-rpath,/path/to/libs 开关链接。

先试试-static。它应该更容易。

如果您想深入了解二进制可移植性问题,请查看以下来源:

【讨论】:

  • 我没有使用 GCC,因为该程序不是用 C 编写的。但是,感谢您提供的链接,我发现了一个名为 cde 的系统,它似乎可以满足我的需求。
  • 您可以为这个cde 链接一个主页/手册页吗?我不知道它是什么/做什么。