在C++项目中如何放置和包含dll文件?

3
我阅读了这篇指南,它向您展示了使用Cairo和Visual C++创建“可视化”应用程序所需的步骤。该指南建议您下载某些dll文件并将它们存储在创建可执行文件(debug)的目录中。 以下是Nil在他的教程中提到的文件列表:
  • cairo二进制文件(是的,您也需要二进制软件包,因为Dev不包含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 - Captain Obvlious
1个回答

9
这种方法没有什么问题,而且可能是让你的应用程序最快速运行的方式。你的应用程序需要这些库,所以将它们放在同一个文件夹中可以让它找到它们。
当然,总有其他选择!
静态链接
为了避免一堆必须与您的应用程序一起存在的dll文件,您可以使用静态链接。您在链接时间链接.lib文件,而不是在运行时链接.dll文件。这会使您的.exe文件变大,但也意味着您可能能够分发单个文件。
将Dlls放在不同的文件夹中
dll文件不必与.exe文件位于同一文件夹中,尽管通常这是最合理的。Windows在运行时寻找.dll文件时会搜索几个文件夹,因此您可以将dll文件放在当前目录、系统目录(绝对不建议)或PATH环境变量中的另一个目录中。实际上,这些位置都不被推荐!将它们放在与.exe文件相同的文件夹中是最安全的,因为通常您对该文件夹具有控制权。
有关Windows如何搜索.dll文件的特定规则在此处概述:http://msdn.microsoft.com/en-ca/library/windows/desktop/ms682586(v=vs.85).aspx 自定义构建步骤
我不喜欢手动将文件放在我的调试或发布文件夹中。我喜欢把调试文件夹想象成我可以随时删除并重新构建的东西,而我也喜欢有一个一步构建过程,可以把所有需要的.dll文件从“源”文件夹(在源控件下)复制到我的输出文件夹中,以便我可以轻松地在任何机器上构建。因此,我通常会创建一个自定义构建步骤,将所需的.dll文件从“源”文件夹(在源控制中)复制到我的输出文件夹中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接