如何在 Linux 上打包 c++ 依赖项
How to package c++ dependencies on linux
我正在使用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/lib
或path/to/app/
文件夹中(,因此您不依赖于系统库。创建您的deb
包,将所有文件放入/opt
或$HOME/appname
文件夹中。您必须"手动"加载所有动态库,或者要求编译器在链接阶段执行此操作(请参阅文档(。
码头工人容器
我对此了解不多,但我确切地知道它需要在目标系统上安装 docker(不是您的选择(。
有用的链接:
G++ 链接选项
静态链接手册
查找动态库或共享库
有类似的文档 叮当声,谷歌一下。
- 如何从C++中的依赖类型中获得它所依赖的类型
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- C++GTKMM gui循环依赖关系
- 通过ccmake在cmake中缓存依赖选项
- 当基类是依赖类型时,这是一个缺陷吗
- 从不同的附加依赖项中识别等同命名的函数
- 如何在 CMake 中对目标依赖项进行分组?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 为什么内存屏障依赖于变量?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 反转依赖于 end() 的迭代器
- GCC,CMake,预编译标头和维护依赖项
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 为什么依赖模板类型在部分专用化中不可推导?