GCC - ссылка на библиотеку в другой папке работает, но бинарный не запускается

Я работаю над проектом C++, который генерирует несколько EXE и несколько DLL. Для удобства я бы хотел, чтобы эти DLL создавались в папке Lib, поэтому встроенный проект будет выглядеть следующим образом:

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

Мне удалось успешно встроить библиотеки DLL в папку Lib, и я смог успешно связать библиотеки DLL в их новом расположении, используя -L..\bin\Lib в команде связывания для EXE-файлов. Однако, когда я действительно запускаю EXE-файлы, они жалуются, что не могут найти нужные DLL-библиотеки.

Из проведенного мною исследования похоже, что хотя я могу связывать библиотеки с другими папками, загрузка их по-прежнему требует, чтобы они находились в той же папке, что и двоичные файлы.

GCC, связывающий библиотеки, не найден? предполагает, что это просто так, как должно быть, но упоминает, что "система должна быть в состоянии найти DLL; т.е. она должна быть в текущем рабочем каталоге, в каталоге, который находится в пути, или в его каталоге должен быть добавлен в специальную переменную среды, используемую для этой вещи ". На какую "специальную переменную среды" ссылаются (я предполагаю, что это не%PATH%, иначе в комментарии не упоминался бы ранее путь), и есть ли способ, которым я могу установить его, чтобы мои DLL могли быть правильно загружены?

1 ответ

Решение

Полная информация о порядке поиска 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. Другой вариант - динамическая загрузка DLL с использованием LoadLibraryEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179%28v=vs.85%29.aspx

Другие вопросы по тегам