2013-07-26 40 views
2

我的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++应用程序。如何在Linux上部署C++应用程序

  1. 静态链接
  2. 动态链接,也部署所有依赖于目标服务器?

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

+0

你有没有看过“cmake”来管理依赖和简单的rpm构建? – kfsone

回答

1

如果依赖关系很小,最简单的方法就是静态编译所有东西。在构建步骤中相当容易,并且不需要任何花哨。但是,随着更大的图书馆和更大的项目,这可能会变得不方便。

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

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

我很确定一些为linux发布的预编译程序以这种方式工作。奇怪的是,我目前找不到任何自定义的预编译应用程序。

+0

找到,我现在应该从静态链接开始。这很容易,我的应用程序不是很大。 –

0

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

+1

虽然正确的方法是实际制作一个Linux发行版的软件包。 – 2013-07-26 00:33:09

+0

@ VladLazarenko:那么在Blender项目中,决定制作一个通用的tarball可分发将比软件包更好。我必须同意,因为发行版可以很容易地从中发布一个包,而使用利基发行版的人也可以使用它。 – datenwolf

+0

没错。但想象一下,所有软件包都具有静态链接的所有依赖关系的世界。那会很糟糕。这两种方法都有其优点和缺点,如往常一样:) – 2013-07-26 12:43:00

相关问题