【问题标题】:Dynamic Libraries, dependencies and distribution?动态库、依赖项和分发?
【发布时间】:2014-07-06 15:20:36
【问题描述】:

在我开始开发更多 c++ 项目之前,我想建立一个良好的多平台环境并使用一些基本的修订形式 (rsync)。为此,我不学习如何构造 makefile(使用 uname 变量),还开始在 windows 上的 cygwin 环境中使用 mingw。这样我就有希望在类似 Unix 的 shell 下以同质的方式在所有平台上进行开发。

我不明白的是分发依赖于动态库的编译程序的标准工作实践。例如,当我在 windows 上使用 mingw 编译时,我需要将最基本的库(libstdc++-6.dll)添加到可执行目录中才能运行。仅对于标准库,我需要添加三个 .dll,即使依赖 walker 显示了无数更多,尽管它似乎可以运行。

肯定每个库都需要包含,因为无法保证最终用户会在本地拥有它?

如果是这种情况,是否通常只将动态库包含在与可执行文件相同的目录中?

我还读到 .so 文件既可以用作导入库,也可以用作动态库。那么这些是否也需要包含在可执行目录中?

Cmake 对于这些事情很有用,我想我最终会使用它。这就是说我认为先学习如何在没有它的情况下完成跨平台开发对我有帮助。

【问题讨论】:

  • 使用git 比使用rsync 更好地进行版本控制。并考虑为您的软件制作一个软件包(例如 *.deb),至少对于 Linux 而言。
  • 这是真的,我想学习如何使用 git,Linux/Mac 似乎比 windows 更容易管理。例如,我想知道的是您的分布式包中是否包含标准库?

标签: c++ dependencies cross-platform dynamic-library


【解决方案1】:

不,您不需要包含依赖遍历器中提到的每个.dll。其中大部分,包括标准库,由 Microsoft/Posix/etc 保证。可用于操作系统。

一个好的经验法则是,如果您必须将其安装在您的计算机上,您可能必须将其安装在用户计算机上。

【讨论】:

  • 我的一个问题是我在 cygwin 中使用 mingw,这意味着我的标准系统库在该环境中必须以不同的方式命名,因为当我尝试从 Windows 资源管理器运行时找不到它们。
  • Cygwin,以及在较小程度上的 mingw,链接到它自己的许多库版本。这就是它允许编译和运行使各种 POSIX 库和系统调用在 Windows 上运行的程序的方式。但是,我认为整个内容都包含在您必须重新分发的一两个 .dll 文件中,并且在 mingw 的情况下,有一个编译器选项(不记得确切是哪个)将其静态链接到所以不需要分发额外的库。
  • 我找到了静态选项 (-static-lib),所以现在可以使用。计划在项目变得更大时切换到 cmake/git。
【解决方案2】:

两件事:

  1. 如果您的依赖项不是很大,您可以在名为 lib 的子目录中包含部分库,并在那里编译它们以编译您的应用程序。如果你依赖于 boost 文件系统或 boost 线程或你有什么,在 C++ 中将部分 Boost 分发包含在 lib 文件夹中是相当常见的。

  2. CMake 等工具非常适合轻松构建跨平台 makefile。如果安装了库,它们会负责查找库的所有工作,甚至可以编写以下载丢失的库。像这样的解决方案可以使您的分发代码保持较小,并且仍然可以为您提供所需的一切。我个人在所有应用程序中都使用 CMake,因为我讨厌编写 makefile,而 glob_recurse 非常有用。

【讨论】:

  • 那么有没有办法将所有包含的动态库放在可执行文件的子目录中以进行分发?还有什么好的 CMake 学习资源可以推荐吗?
  • @josh247 学习 CMake 的最佳方法可能是阅读一堆小示例文件并尝试了解每一行的实际作用。最简单的 CMake 文件可能只有几行并且非常清晰。您可以在源代码中包含库并编译它们,除非您已经知道确切的目标系统,否则我认为拥有预编译库是不可行的。
猜你喜欢
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多