C++ 将 DLL 从根目录移出到子文件夹中,visual studio

C++ Moving DLL out of root directory into a subfolder, visual studio

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

问题是根文件夹下的所有DLL都乱七八糟,所以我想把它们整理成子文件夹。但我不能那样做,因为将 DLL 放在根子文件夹而不是根文件夹中,会出现错误。我认为是因为 DLL 被复制到错误位置的输出,不是 exe 所在的位置,而是在子文件夹中,就像源结构一样。我说得对吗?

什么解决方案可以让我的项目在机器之间仍然 copy-pastable/portable?

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

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

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

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

虽然可以将 DLL 分隔到子目录中,但最好将它们与可执行映像放在一起。