【问题标题】:How to package c++ dependencies on linux如何在linux上打包c++依赖
【发布时间】:2017-07-26 08:02:43
【问题描述】:

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

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

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

奖金问题:
目前,这只是一个简单的命令行程序,我可以轻松地重新编译所有 3rd 方依赖项(实际上我这样做了)。然而,从长远来看,我还想移植一个 QT 应用程序。理想情况下,该解决方案也适用于该场景。

【问题讨论】:

  • google://docker
  • @arrowd:你能详细说明一下吗?我无法在目标系统上安装 docker,也无法在 Ubuntu 14.04 上编译我的程序。
  • 您可以将您的程序作为 docker-packed 容器分发。
  • 如果担心标准库,可以静态链接。 stackoverflow.com/questions/26103966/…
  • @xaxxon:嗯,它不仅仅是标准库。我也在使用其他一些库,但标准库是我唯一确定 ubuntu14.04 上的版本太旧的库。但是,由于所有库都链接到 stl,我可能还必须打包它们。静态链接所有内容可能适用于我当前的场景,但它不会起作用 - 例如,当它变得非常复杂时链接 qt 或其他更复杂的系统库。

标签: c++ linux cmake packaging


【解决方案1】:

您的条件中最糟糕的部分是不兼容的标准库。 无论如何,您必须静态链接它(请参阅 cmets 到您的答案)。

多种选择:

完全静态链接:

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

您只需像往常一样构建您的应用程序,然后将其与您需要的所有库静态链接(请参阅编译器的文档)。因此,您将获得完全无依赖关系的可执行文件,它可以在任何 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 一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2017-09-03
    • 2010-09-19
    • 2019-06-06
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多