如何在Linux上部署C ++应用程序

我的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. dynamic链接,还部署所有的依赖关系到目标服务器?

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

如果依赖关系很小,最简单的方法是静态编译所有东西。 在构建步骤中相当容易,不需要任何花费。 但是,如果图书馆规模较大,项目规模较大,则可能会带来不便。

我认为最好的做法是将依赖关系编译成共享对象,然后沿着二进制文件发送它们,并以ld将会查找你的东西的方式执行。 我认为这是可能的,例如使用LD_LIBRARY_PATH例如LD_LIBRARY_PATH=/where/did/i/ship/lib:$LD_LIBRARY_PATH my_binary

这可能会有点麻烦,因为你需要建立你的编译系统来编译东西作为共享对象,并妥善包装一切。

我很确定一些为Linux发行的预编译程序是这样工作的。 奇怪的是,我目前找不到任何自定义的预编译应用程序。

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