GCC - 链接到另一个文件夹中的库有效,但二进制文件不会运行

GCC - linking to a library in another folder works but binary won't run

本文关键字:有效 二进制文件 运行 链接 另一个 文件夹 GCC      更新时间:2023-10-16

我正在做一个C++项目,该项目生成多个EXE和多个DLL。为了整洁起见,我希望在 Lib 文件夹中生成这些 DLL,因此构建的项目如下所示:

MyProject
----myExe1.exe
----myExe2.exe
----Lib
    ----myLib1.dll
    ----myLib2.dll

我能够成功地将 DLL 内置到 Lib 文件夹中,并且我能够使用 EXE 的链接命令中的-L..binLib成功链接到新位置的 DLL。但是,当我实际运行 EXE 时,他们抱怨找不到有问题的 DLL。

从我所做的研究来看,看起来即使我可以链接到其他文件夹中的库,加载它们仍然需要它们与二进制文件位于同一文件夹中。

GCC,链接库,没有找到? 建议这只是事情的本意,但提到"系统必须能够找到 DLL;即它必须位于当前工作目录中,在路径中的目录中,或者其目录必须添加到用于此事物的特殊环境变量中"。引用了什么"特殊环境变量"(我假设它不是 %PATH%,或者注释之前不会特别提到路径),有没有办法设置它以便我的 DLL 可以正确加载?

有关 DLL 搜索顺序的完整信息在 MSDN 站点上: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx

简短版本:在 DLL 加载期间,操作系统按以下顺序搜索它:

  1. 从中加载应用程序的目录。
  2. 系统目录(即 C:\Windows\System32)
  3. 16 位系统目录。
  4. Windows 目录(即 C:\Windows)
  5. 当前目录。
  6. PATH 环境变量中列出的目录。

因此,如果要将exe文件与dll分开,则必须将包含库的文件夹放入PATH中。另一个选项是使用 LoadLibraryEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179%28v=vs.85%29.aspx 进行动态 DLL 加载