Компиляция x64 dll из x86 с использованием Visual Studio 2008 - PullRequest
1 голос
/ 21 июля 2010

Я компилирую некоторый внешний код C ++ в dll, используя Visual Studio 2008. Код обернут в extern "C".

Поскольку я кросс-компилирую, создаю 64-битную DLL на моей 32-битной машине; Я использую x64 в качестве «платформы активного решения» в «Configuration Manager».

Моя DLL успешно компилируется и связывается. Однако, когда я открываю его в Dependency Walker (зависимость.exe), я замечаю нечто странное: Моя DLL отмечена как 64-битная. Однако моя DLL зависит от C: \ windows \ system32 \ ntdll.dll и C: \ windows \ system32 \ kernel32.dll, которые являются 32-битными! В результате Dependency Walker выдает мне следующие ошибки: «Ошибка: по крайней мере один модуль имеет неразрешенный импорт из-за отсутствия функции экспорта в неявно зависимом модуле. Ошибка: найдены модули с разными типами ЦП. "

Что здесь не так?

Заранее спасибо за любые ответы!

Ответы [ 3 ]

2 голосов
/ 21 июля 2010

Обходчик зависимостей выдает эту ошибку, потому что файлы DLL в system32 в вашей 32-битной системе имеют размер 32 бита. Если вы запустите его на 64-битной версии Windows, он будет работать нормально.

Возможно, недоразумение происходит от имени system32? Он не обязательно содержит 32-битные файлы - он содержит файлы, соответствующие размеру операционной системы, поэтому в 32-битной Windows sytem32 содержится 32-битная библиотека, а в 64-битной Windows system32 - 64-битная библиотека.

Это усложняется: 64-битная Windows может запускать 32-битные процессы, и если 32-битный процесс обращается к system32 в 64-битной версии Windows, этот доступ перенаправляется на SysWOW64 (да system32 содержит 64-битные dll и SysWOW64 содержат 32-битные dll).

1 голос
/ 21 июля 2010

Ваша DLL зависит от ntdll.dll и kernel32.dll. Зависимость Уокер пытается найти их в соответствии с правилом поиска функции LoadLibrary. И он находит их в каталоге system32, но в 32-битной системе они 32-битные.

0 голосов
/ 27 июня 2014

Используйте 64-битную версию Dependency Walker, чтобы открыть 64-битную версию DLL.Вы больше не увидите сообщение об ошибке «Ошибка: найдены модули с разными типами ЦП», если ваши модули правильно скомпилированы для x64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...