在哪里放置以及如何在 c++ 项目中包含 dll 文件?

Posted

技术标签:

【中文标题】在哪里放置以及如何在 c++ 项目中包含 dll 文件?【英文标题】:Where to place and how to include dll files in c++ project? 【发布时间】:2013-04-17 15:52:46 【问题描述】:

我阅读了这个guide,它将引导您完成使用 Cairo 和 Visual C++ 创建“可视”应用程序所需的步骤。该指南建议您下载某些 dll 文件并将它们存储在创建可执行文件的目录中(调试)。 以下是 Nil 在他的教程中引用的文件列表:

cairo 二进制文件(是的,你也需要二进制包,因为开发版不包含 DLL)-> libcairo-2.dll zlib 二进制文件 -> zlib1.dll libpng 二进制文件 -> libpng12-0.dll Freetype 二进制文件 -> freetype6.dll FontConfig 二进制文件 -> libfontconfig-1.dll expat 二进制文件 -> libexpat-1.dll

如您所见,文件非常多。我一直想知道这是否是“正确”的做法?在这种情况下,是否有另一种被认为是“最佳实践”的方法?

【问题讨论】:

该指南正确地指出 DLL 应与使用它们的应用程序放在同一目录中。它们不是系统 DLL,不属于 /windows/windows/systemXX 【参考方案1】:

这种方法没有任何问题,它可能是让您的应用程序启动并运行的最快方法。您的应用程序需要这些库,因此将它们放在同一个文件夹中可以找到它们。

当然总是有替代品!

静态链接

为避免您的应用程序必须存在大量 dll,您可以使用静态链接。您在链接时链接 .lib 文件,而不是在运行时链接到 .dll 文件。使您的 .exe 更大,但意味着您可以分发单个文件。

将 Dll 放在不同的文件夹中

dll 不必与 .exe 位于同一文件夹中,尽管这通常是最有意义的。 Windows 在运行时查找 .dll 时会搜索多个文件夹,因此您可以将 dll 放在当前目录、系统目录(绝对不推荐)或 PATH 环境变量中的另一个目录中。其实这些地方都不推荐!将它们与 .exe 放在同一个文件夹中是最安全的,因为通常您可以控制该文件夹。

此处概述了 Windows 如何搜索 .dll 的具体规则:http://msdn.microsoft.com/en-ca/library/windows/desktop/ms682586(v=vs.85).aspx

自定义构建步骤

我不喜欢手动将文件放入我的调试或发布文件夹。我喜欢将调试文件夹视为我可以随时删除和重建的东西,并且我喜欢有一个一步构建过程,将所有内容放在需要的位置,以便我可以轻松地在任何机器上构建。因此,我通常会创建一个自定义构建步骤,将所需的 .dll 从“源”文件夹(在源代码管理中)复制到我的输出文件夹中。

【讨论】:

以上是关于在哪里放置以及如何在 c++ 项目中包含 dll 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在C ++应用程序中包含EXTERNAL PCH文件?

在 Netbeans 7.0 中包含 C++ 库

在 VC++(VS2010) 项目输出中包含 DLL

在安装项目中包含文件依赖项

在 Visual C++ DLL 中包含 MFC 资源(CDialog-Form)

使用 Visual Studio 2010 在 dll 项目中包含 Qt 工具