C++正在将DLL从根目录移到visual studio的子文件夹中

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

本文关键字:studio visual 文件夹 DLL 根目录 C++      更新时间:2023-10-16

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

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

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

Windows在预定义位置搜索DLL(请参阅动态链接库搜索顺序(。应用程序所在目录的子目录不属于搜索顺序的一部分。

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

  1. 除了应用程序启动时的默认搜索位置外,还要为要搜索的每个目录调用AddDllDirectory
  2. 默认情况下,DLL导入在启动进程的主线程之前进行解析。若要允许应用程序更改DLL搜索路径,需要推迟导入解析。最简单的方法是使用/DELAYLOAD(延迟加载导入(链接器选项(有关其他信息,请参阅延迟加载DLL的链接器支持(

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

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