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

How to package c++ dependencies on linux

本文关键字:c++ 依赖 Linux      更新时间:2023-10-16

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

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

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

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

您的连续性中最糟糕的部分是不兼容的标准库。 无论如何,您都必须静态链接它(请参阅答案的评论(。

多种选择:

完全静态链接:

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

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

部分静态链接

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

码头工人容器

我对此了解不多,但我确切地知道它需要在目标系统上安装 docker(不是您的选择(。

有用的链接:

G++ 链接选项

静态链接手册

查找动态库或共享库

有类似的文档 叮当声,谷歌一下。