如何在linux上打包c ++依赖项

时间:2017-07-26 08:02:44

标签: c++ linux cmake packaging

我正在使用cmake在Ubuntu 16.04上开发一个c ++程序,使用g ++ 5和clang ++ - 3.8进行编译。

现在我也想让这个程序可用于14.04,但由于我使用了很多c ++ 14的功能,我只能在该系统上重新编译它。相反,我想询问是否/如何以一种我可以解压缩目标系统上的文件夹并运行应用程序的方式打包所有依赖项(特别是c ++标准库)。

理想情况下,我正在寻找一些可以添加到我的cmake构建中的自动/脚本化解决方案。

奖金问题:
现在,这只是一个简单的命令行程序,我可以轻松地重新编译所有第三方依赖项(事实上我也是如此)。但从长远来看,我也想移植一个QT应用程序。理想情况下,该解决方案也适用于该场景。

1 个答案:

答案 0 :(得分:1)

您的合同中最糟糕的部分是不兼容的标准库。 无论如何,你必须静态地链接它(请参阅你的答案的评论)。

许多选项:

完全静态链接:

我认为这对您来说是最简单的方法,但它要求您可以构建(或以任何方式获取)所有第三方库作为静态。如果由于某种原因你不能选择它。

您只需像往常一样构建应用程序,然后将其与静态需要的所有库链接(请参阅编译器的文档)。因此,您可以获得完全无依赖性的可执行文件,它可以在任何兼容ABI的系统上运行(您可能需要检查x86可执行文件是否适用于x86_64)。

部分静态链接

您可以静态链接所有内容,也可以动态链接其他内容。因此,您将所有动态库(*.so)与您的应用程序(在path/to/app/libpath/to/app/文件夹中)一起分发,因此您不依赖于系统库。创建deb包,将所有文件放入/opt$HOME/appname文件夹。您必须加载所有动态库"by hand"或要求编译器在链接阶段执行此操作(请参阅文档)。

Docker容器

我对它知之甚少,但我确切地知道它需要在目标系统上安装docker(不是你的选择)。

有用的链接:

g++ link options

static linking manual

Finding Dynamic or Shared Libraries

clang有类似的文档,google it。