动态库、依赖关系和分布

Dynamic Libraries, dependencies and distribution?

本文关键字:分布 关系 依赖 动态      更新时间:2023-10-16

在我开始开发更多的c++项目之前,我想建立一个良好的多平台环境,并使用一些基本的修订形式(rsync)。为了做到这一点,我学会了如何构造makefile(使用未命名的变量),并开始在windows上的cygwin环境中使用mingw。这样我就有希望在所有平台上以一种类似unix的方式进行开发。

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

当然每个库都需要包含在内,因为不可能保证最终用户在本地拥有它?

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

我还读到。so文件作为一个导入库和一个动态库。那么这些也需要包含在可执行目录中吗?

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

不,您不需要包含依赖项漫游器中提到的每个.dll。它们中的大多数,包括标准库,都是由Microsoft/Posix等保证的。

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

两件事:

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

  2. 像CMake这样的工具可以很容易地构建跨平台的makefile。如果安装了库,它们会负责查找库的所有工作,甚至可以编写来下载丢失的库。这样的解决方案可以使您的发行版代码保持较小,并且仍然可以获得所需的一切。就我个人而言,我使用CMake为我所有的应用程序,因为我讨厌写makefile和glob_recurse是如此有用。