4

我的 c++ 应用程序依赖于 GCC、MongoDB C++ 驱动程序和 Boost。我目前的方法是保持操作系统一致。我在 Ubuntu 12.04 64 位桌面上开发 C++,并将其部署在 Ubuntu 12.04 64 位服务器上。另外我应该在目标服务器上安装相同版本的依赖项。但是如果我想在 Ubuntu 13.04 上开发我的 C++ 应用程序并使用最新的 Boost、MongoDB 驱动程序和 GCC 4.8.1,那么在 Ubuntu 12.04 服务器上部署 C++ 应用程序很容易。

  1. 静态链接
  2. 动态链接,还将所有依赖项部署到目标服务器?

哪种方式简单?有时,我无法在目标服务器上编译库。

4

2 回答 2

2

如果依赖项很小,最简单的方法是静态编译所有内容。在构建步骤中相当容易,不需要任何花哨的东西。但是,对于更大的库和更大的项目,这可能会变得不方便。

我认为最好的做法是将依赖项编译成共享对象,将它们与二进制文件一起发送,并以一种首先ld寻找你的东西的方式执行东西。我认为例如使用LD_LIBRARY_PATHeg是可能的LD_LIBRARY_PATH=/where/did/i/ship/lib:$LD_LIBRARY_PATH my_binary

这可能有点麻烦,因为您需要设置构建系统以将内容编译为共享对象并正确打包所有内容。

我很确定一些为 linux 提供的预编译程序就是这样工作的。奇怪的是,我目前在我手下找不到任何自定义的预编译应用程序。

于 2013-07-26T01:17:54.060 回答
0

这取决于您的应用程序。如果您的应用程序仅包含一个特定的二进制文件,则所有 C++ 库的静态链接都是有序的。您可以安全地动态链接所有 C 库,因为 C ABI 是不变的;这只会给您留下版本依赖关系。然而,在大多数情况下,主要的 SO-Name 版本大多是兼容的,并且可以并行安装不同主要 SO-Name 的库。所以我会依靠包管理器来安装它们。由于缺乏通用的 ABI,C++ 库很棘手。即使仅仅是编译器版本的碰撞也会使它们不兼容*叹气*。

于 2013-07-26T00:32:04.337 回答