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

时间:2013-07-26 00:28:17

标签: c++ linux gcc

我的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. 动态链接,还将所有依赖项部署到目标服务器?
  3. 哪种方式很简单?有时,我无法在目标服务器上编译库。

2 个答案:

答案 0 :(得分:1)

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

我认为最佳做法是将依赖项编译到共享对象中,然后以ld将首先查找您的内容的方式执行。我认为可以通过例如使用LD_LIBRARY_PATH来实现,例如LD_LIBRARY_PATH=/where/did/i/ship/lib:$LD_LIBRARY_PATH my_binary

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

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

答案 1 :(得分:0)

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