Существует ли Windows / MSVC, эквивалентный флагу компоновщика -rpath? - PullRequest
42 голосов
/ 20 сентября 2008

В Linux / GCC я могу использовать флаг -rpath, чтобы изменить путь поиска исполняемых файлов для разделяемых библиотек без изменения переменных среды.

Можно ли это сделать и в Windows? Насколько я знаю, dll всегда ищется в каталоге исполняемого файла и в PATH.

Мой сценарий: я хотел бы поместить разделяемые библиотеки в места в соответствии с их свойствами (32 / 64bit / Debug / Release), не заботясь об уникальных именах. В Linux это легко сделать через rpath, но я пока не нашел способа сделать это в Windows.

Спасибо за любые подсказки!

Ответы [ 3 ]

21 голосов
/ 23 октября 2008

К сожалению, нет прямого аналога RPATH. Существует ряд альтернативных возможностей, каждая из которых, скорее всего, нежелательна для вас по-своему.

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

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

Вместо этого вы можете изменить текущий рабочий каталог перед запуском программы в нужную папку DLL.

Вы можете использовать функцию SetDllDirectory или AddDllDirectory внутри вашего exe. Это, вероятно, ближе всего к RPATH, но работает только на WinXP SP1 или более поздней версии.

Если вы хотите изменить имя файла каждого варианта exe, вы можете использовать раздел реестра «Пути к приложениям». Каждому exe-файлу потребуется уникальное имя файла.

4 голосов
/ 20 сентября 2008

Порядок поиска DLL в Windows описан на этой странице в MSDN. Если вы используете динамическое связывание во время выполнения , вы можете указать папку при вызове LoadLibrary.

3 голосов
/ 20 сентября 2008

«Изолированные приложения» - это механизм для встраивания манифеста XML, который описывает зависимости DLL.

...