如何打包 linux 上的 C++ 依赖项

How to package c++ dependencies on linux

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

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

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

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

您的条件中最糟糕的部分是不兼容的标准库。 无论如何,您都必须静态 link 它(请参阅对您的回答的评论)。

多个选项:

完全静态 linking:

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

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

部分静态linking

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

Docker 容器

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

有用links:

g++ link options

static linking manual

Finding Dynamic or Shared Libraries

clang 有类似的文档,google它。