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

时间:2015-07-04 14:32:11

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

  1. 除了应用程序启动时的默认搜索位置外,还要为要搜索的每个目录调用AddDllDirectory
  2. 默认情况下,在开始进程之前解析DLL导入。主线程。要允许您的应用程序更改DLL搜索路径,需要推迟导入解析。最简单的方法是使用/DELAYLOAD (Delay Load Import)链接器选项(有关其他信息,请参阅Linker Support for Delay-Loaded DLLs)。
  3. 虽然有可能将DLL分离到子目录中,但最好将它们放在可执行映像旁边。