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

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

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

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


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


Ответы (3)


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

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

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

@echo off
PATH=libs64;%PATH%
prog.exe
person Ben    schedule 26.09.2014
comment
Изменение переменной среды пути может сработать, но мне интересно, может ли встраивание манифеста с необходимой DLL также решить проблему? Должен ли Foreignlibrary.dll соответствовать каким-либо требованиям, чтобы я мог использовать его в манифесте? - person HelloWorld; 29.09.2014

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

person HelloWorld    schedule 11.06.2015

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

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

person SamB    schedule 25.12.2015