动态库,依赖和分发?

时间:2014-07-06 15:20:37

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

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

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

当然,每个图书馆都需要包含在内,因为无法保证最终用户能够在本地使用它吗?

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

我还读到.so文件充当导入库以及动态库。那么这些还需要包含在可执行文件目录中吗?

Cmake对这些事情非常有用,我认为我最终会使用它。这说我认为如果没有它首先要学习如何完成跨平台开发会对我有所帮助。

2 个答案:

答案 0 :(得分:1)

不,您不需要包含依赖性walker中提到的每个.dll。其中大多数,包括标准库,都由Microsoft / Posix / etc保证。可以在操作系统中使用。

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

答案 1 :(得分:0)

两件事:

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

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