Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Неправильная архитектура библиотеки с задержкой загрузки

Автор вопроса: HelloWorldОтветов: 3

В Windows моя библиотека x64 (foo.dll) имеет загруженную с задержкой зависимость от другой библиотеки x64 (foreignlibrary.dll), имя которой совпадает с именем 32-библиотеки (foreignlibrary.dll). Конечно, они находятся в разных каталогах. Обычно числа используются как msvcr110.dll или msvcr120.dll, но в данном случае это не так.

Моя библиотека не может быть загружена, потому что (по крайней мере, это то, что говорит мне обходчик зависимостей), потому что она загрузила 32-разрядную версию Foreignlibrary.dll.

Кажется, это первое, что он нашел с этим именем. Как я могу убедиться, что загружена правильная библиотека x64.

  • Какой вообще смысл развертывать эту версию x86? Это никогда не будет полезно. Развертывайте его только с x86-сборкой foo.dll. Hans Passant 25.09.2014
  • Я не развертываю стороннюю (32-разрядную) библиотеку, она уже есть в системе, как и 32-разрядная версия msvcr110.dll, и я ничего не могу с этим поделать. Я просто говорю, что эта библиотека кажется быть загружен, потому что имя совпадает, поэтому дополнительных проверок, похоже, нет. HelloWorld 25.09.2014
  • Довольно неясно, почему он находит неправильную разрядность этой DLL, у Windows есть очень конкретные меры противодействия этому. Например, 32-битные процессы перенаправляются в c:\windows\syswow64 и c:\program files (x86). Во всяком случае, поместите любую DLL, от которой вы зависите, в тот же каталог, что и EXE. Вот куда операционная система смотрит в первую очередь, так она никогда не ошибется. Вы сами должны скопировать правильную разрядность msvcr110.dll. Hans Passant 25.09.2014
  • По лицензии мне может быть не разрешено отправлять/копировать/модифицировать dll, поэтому я могу просто потеряться здесь. Думал, что этот манифест-ад и процедура поиска в Windows отвечают за то, чтобы избежать этих проблем. HelloWorld 25.09.2014
  • Все зависит от того, как настроена сторонняя библиотека. Вы спрашивали продавца, как вы должны это сделать? В любом случае у вас всегда есть запасной вариант загрузки библиотеки во время выполнения, а не использование времени загрузки или отложенной загрузки. (Не по теме, но важное предупреждение, поскольку вы уже упомянули о лицензировании: некоторые разработчики утверждают, что у вас должна быть лицензия для разработки кода, который динамически связывается с их DLL. Если вы не уверены, дает ли рассматриваемая лицензия разрешение на сделать это, вы можете проконсультироваться с юристом.) Harry Johnston 26.09.2014
  • Я еще не спрашивал продавца. Просто интересно. Кстати, бывает и так, что загружается не та версия. Помогут ли мне файлы манифеста обеспечить загрузку DLL с определенной версией? HelloWorld 26.09.2014

windowsdlldllimport

Ответы

Ответ 1 · Ben

Прежде чем запускать приложение, которое загружает foo.dll, настройте среду, чтобы добавить местоположение 64-разрядной внешней библиотеки.dll в начало переменной PATH. Когда вашему приложению необходимо загрузить иностранную библиотеку.dll, оно найдет ее в указанном вами местоположении до того, как найдет ее в 32-разрядном каталоге.

Вы можете изменить системные пути самостоятельно или (что я предпочитаю) создать файл .bat, который устанавливает PATH, а затем запускает исполняемый файл.

Предполагая, что ваш .bat находится в том же месте, что и ваш exe, а ваша библиотека находится в libs64:

@echo off
PATH=libs64;%PATH%
prog.exe

Ответ 2 · HelloWorld

Оказалось, что это ошибка компилятора Intel.

Ответ 3 · SamB

Это предупреждение от обходчика зависимостей не обязательно является поводом для беспокойства; Windows, в отличие от обходчика зависимостей, будет игнорировать DLL-файлы неправильной архитектуры и продолжит поиск одной из правильных архитектур. Если в пути поиска нет такого файла, это означает, что у вас возникла проблема.

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы