【问题标题】:C++ Moving DLL out of root directory into a subfolder, visual studioC++ 将 DLL 从根目录移到子文件夹中,visual studio
【发布时间】:2015-07-04 14:32:10
【问题描述】:

我是使用 C++ 构建软件的初学者。在我的项目中,我链接到 DLL,并将它们存储在根文件夹中。我这样做是因为我希望项目能够从一台机器移植到另一台机器,并且我还希望发布版本能够依赖于将东西安装到 system32 中,而不是。

问题是根文件夹中的所有 DLL 都很乱,所以我想将它们组织到子文件夹中。但我不能这样做,因为将 DLL 放在根子文件夹而不是根目录中,会出现错误。我认为是因为 DLL 被复制到错误位置的输出,而不是 exe 所在的位置,而是在子文件夹中,就像源结构一样。我说的对吗?

有什么解决方案可以让我让项目在机器之间仍然可以复制粘贴/可移植?

【问题讨论】:

  • 将 DLL 与可执行文件放在同一文件夹中。

标签: c++ windows visual-studio visual-c++ dll


【解决方案1】:

Windows 在预定义的位置搜索 DLL(请参阅Dynamic-Link Library Search Order)。应用程序所在目录的子目录不属于搜索顺序。

要实现您的要求,您需要将目录显式添加到搜索的位置。这个过程包括两个步骤:

  1. 除了应用程序启动时的默认搜索位置之外,为您要搜索的每个目录调用 AddDllDirectory
  2. 默认情况下,DLL 导入在启动进程的主线程之前解析。要允许您的应用程序更改 DLL 搜索路径,需要推迟导入解析。最简单的方法是使用/DELAYLOAD (Delay Load Import) 链接器选项(有关更多信息,请参阅Linker Support for Delay-Loaded DLLs)。

虽然可以将 DLL 分离到子目录中,但最好将它们全部放在可执行映像旁边。

【讨论】:

    【解决方案2】:

    如果您将 DLL 放入子文件夹而不是将它们与可执行文件保存在同一目录中,则必须修改 Windows 中的 PATH 环境变量以指向每个子文件夹,或者使用 LoadLibrary+GetProcAddress way 中的 DLL 而不是链接通过导入库将它们添加到可执行文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      相关资源
      最近更新 更多